Как организовать поиск из 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 в одной из таблиц может не появится из за критериев поиска.
Следует учесть, что во время поиска itemId в одной из таблиц может не появится из за критериев поиска.
Казнить нельзя помиловать.
Кто не появится то?
P.S. попробуйте визуальный редактор запросов в DBForge Stuidio for MySQL - при составлении сложных запросов там можно просто в визуальном редакторе связать стрелочками таблицы, и их поля - прямо мышкой всё делается. Я был приятно удивлен, как просто там составлять запросы.
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
Для правильного вопроса надо знать половину ответа
А в чём сложность то?
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))
)
делал ранее через INNER JOIN и при подключении третьtго INNER JOIN время запроса выполнялось пол минуты, а результат в 10-13 позиций с учетом группировки по id