2010-02-07 5 views
2

У меня есть 3 таблицы:Список элементов по категориям

категории doesnt matter

item2cat: itemID|catID

пункт: id|name|desc

Я хочу, чтобы перечислить предметы, которые находятся в данной категории, но Я не знаю, как это сделать простым способом. (С PHP и MySQL)

Мне нужна эта структура таблицы, потому что я хочу, чтобы несколько категорий были связаны с одним элементом.

ответ

2

Вы, вероятно, хотите join таблицу item2cat на свой пункт таблицы:

SELECT 
    item.id 
, item.name 
, item.desc 
FROM item 
INNER JOIN item2cat ON item.id = item2cat.itemID 
WHERE item2cat.catID = [category_id] 

или, например

SELECT 
    item.id 
, item.name 
, item.desc 
, category.id 
, category.name 
FROM item 
INNER JOIN item2cat ON item.id = item2cat.itemID 
INNER JOIN category ON item2cat.catID = category.id 
WHERE category.id IN ([category_id], [category_id], [category_id]) 

UPDATE
Если вы изменили свои идентификаторы таблиц, как это:

item (itemId, name, desc) 
item2cat (itemId, categoryId) 
category (categoryId, name, etc) 

можно переписать первый запрос, как:

SELECT 
    item.itemId 
, item.name 
, item.desc 
FROM item 
INNER JOIN item2cat USING(itemId) 
WHERE item2cat.categoryId = [category_id] 

Еще одно преимущество заключается в том, что id столбец каждой таблицы теперь однозначно.

+0

О, спасибо, в своем решении я зажмурил где часть. –

+1

Зачем использовать LEFT OUTER JOIN, если вы хотите только перечислить элементы в данной категии? использование INNER JOIN должно быть намного более эффективным и избежать ненужных полномасштабных сканирований –

+1

@Saggi Malachi, спасибо, обновлено – Jacco

0

Это один должен быть эффективным и получить все соответствующие элементы в данной категории:

SELECT item.* 
    FROM item2cat 
     JOIN item 
    ON item.id = item2cat.itemID 
     and item2cat.catID = $categoryID 
Смежные вопросы