@Bugsmafia

Как организовать поиск из 3-4х таблиц без ущерба скорости?

Имеется основная главная таблица под названием "Items"
id (ai), name, ...
Строк в данной таблице около 100к

далее имеется ряд таблиц, что-то типа "тегов", сообщающие что c item.id он связан
Назовем такую таблицу Tags, где tagId (указатель номера тега), itemID (указатель к какому items он привязан)
id (ai), tagId, itemId
кол-во привязанных тегов к одному item.id может быть от 3 до 10.

далее, аналогичная по структуре таблица Tags, так же имеет позиции с указанием itemId.
Назовем такую таблицу как Style
id (ai), styleId, itemId
кол-во привязанных стилей к одному item.id так же может быть от 3 до 10.

и еще одна таблица схожая по строению с tags и style, которая так же будет указывать строки с указанием к Item.id
Назовем такую таблицу Label
id (ai), labelId, itemId
Все так же как и по прошлой схеме. Строк с указанием ItemId может быть до 10-ти

Вопрос. Как сформировать запрос на поиск по labelId, styleId и tagId одновременно, что бы получить список itemId, где присутствует указанный в поиске label, style и/или tag
Следует учесть, что во время поиска itemId в одной из таблиц может не появится из за критериев поиска.
  • Вопрос задан
  • 79 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Bugsmafia Автор вопроса
Итоговое решение вышло....
SELECT
  items.id,
  items_temp.iid,
  items_temp.temp,
  items_style.iid,
  items_style.sid,
  items_lang.iid,
  items_lang.lid,
  items.name
FROM items_lang
  INNER JOIN items
    ON items_lang.aid = items.id
  INNER JOIN items_style
    ON items_style.mid = items.id
  INNER JOIN items_temp
    ON items_temp.mid = items.id
WHERE items_lang.lid = 6
AND items_style.sid = 122
AND items_temp.temp = 6
GROUP BY items.id
ORDER BY items.id
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А в чём сложность то?
SELECT ...
  FROM `items`
  WHERE `id` IN (
    (SELECT `itemId` 
      FROM `tags_items`
      WHERE `tagId` IN (SELECT `id` FROM `tags` WHERE `tag` = :word))
    UNION
    (SELECT `itemId` 
      FROM `styles_items`
      WHERE `styleId` IN (SELECT `id` FROM `styles` WHERE `style` = :word))
    UNION
    (SELECT `itemId` 
      FROM `labels_items`
      WHERE `labelId` IN (SELECT `id` FROM `labels` WHERE `label` = :word))
  )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы