IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Выборка из двух таблиц (https://www.imho.ws/showthread.php?t=85272)

hempsmoke 08.05.2005 03:29

Выборка из двух таблиц
 
мне хотелось бы знать, как сделать листинг категорий и подкатегорий, а возможно и подкатегорий 2 уровня. В точности тоже самое, что и на нашем форуме "Быстрый переход" по форумам, внизу слева в каждом форуме.

я понимаю, что надо объеденить две таблицы, но что потом.... :(
мучался, мучался, но так и не въехал, как скрипту дать понять, что это подкатегорий относиться к этой категории, а эта подкатегория 2 уровня к этой подкатегории.

2 или 3 простейшие таблицы

* cat
id name
1 first
2 second

* subcat
id cat_id name
1 1 first subcat
2 1 second subcat

Спасибо!

Sheryld 08.05.2005 06:40

Зачем хранить категории в разных таблицах? Это у тебя специальный алгоритм такой?

Простой алгоритм дерева категорий.

таблица:

id parentid level

level - будет уровень категорий.

чтобы выбрать все подкатегории n-ого уровня, ограничиваешь рекурсию определенным уровнем.

базовый запрос:

select & from table where parentid = id

пускаешь этот запрос рекурсивно.

у корня level = 0.

подойдет только для небольшого кол-ва вложенных категорий.

если нужно неограниченное кол-во вложенных категорий, то можно глянуть, например nested sets(смотри мою тему: «проблемы с деревом»).

hempsmoke 08.05.2005 16:36

Цитата:

Sheryld:
Зачем хранить категории в разных таблицах? Это у тебя специальный алгоритм такой?
ага. у категорий и подкатегорий разные поля.

Sheryld 08.05.2005 20:08

а тогда так:

select c.*,sc.* from cat as c
inner join subcat as sc
on c.id = sc.cat_id
order by fileds

Ну а дальше как тебе удобно. Можно, например, при парсинге сразу сформировать карты(хеши), типа:

categories = array("catid"=>id,...,"subcats"=>array(...));

subcats = ("id"=>id,...);

Можно это сделать потом, опять же рекурсией. Как? Решение я приводил в теме про деревья. Но там задача даже немного сложнее была, там нужно было сначала проставить связи id->parentid, а у тебя они уже есть из запроса(можно ведь сделать и так: select c.cat_id as catid, cs.subcat_id as subcat_id). Вобщем вариантов море.

На худой конец, уж совсем тривиальное решение.

select * from cats

foreach(...) // для каждой найденой категории в цикле

select * from subcats where subcats.cat_id=catid

Но тогда это будет: (n-найденных категорий+1) запросов, а это гарантированно дольше, чем сделать один запрос и парсить данные.

hempsmoke 13.05.2005 20:42

Sheryld
спасиб. но у меня не получается.

PHP код:

$res=mysql_query("SELECT c.*,sc.* FROM {$prfx}categories as c INNER JOIN {$prfx}subcategories as sc ON c.cid=s.cat_id");
while(
$row=mysql_fetch_array($res))  echo "{$row['s.sid']}<br>"

не выводит ничего. хотелось бы, чтобы выводилось:

категория1
-- подкатегория 1
-- подкатегория 2
---- подподкатегория :)
категори2

вот такую конструкцию как осуществить?

hempsmoke 17.05.2005 20:53

Merlin Cori подкинул мысь - проверить в phpmyadmin запрос - нашел ошибку, спасибо ему :) . Запрос выполняется, теперь пытаюсь вывести
Цитата:

категория1
-- подкатегория 1
-- подкатегория 2
---- подподкатегория
категори2


Часовой пояс GMT +4, время: 23:39.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.