У меня есть несколько таблиц, к которым я присоединяюсь, используя уникальный идентификатор элемента. Большинство условий предложения where будут построены программно из формы, в которую входит пользователь (окно поиска), и несколько условий часто будут проверяться на одной и той же таблице, в данном случае теги элементов.
Мой опыт работы с SQL минимален, но я понимаю основы. Я хочу найти идентификаторы активных (status = 1) предметов, которые были помечены тегом определенного типа, со значениями «коты» и «котята». Теги хранятся как (id, product_id, tag_type_id, value), причем id является единственным столбцом, требующим уникального значения. Моя первая попытка была
select
distinct p2c.product_id
from '.TABLE_PRODUCT_TO_CATEGORY.' p2c
inner join '.TABLE_PRODUCT.' p on p2c.product_id = p.id
inner join '.TABLE_PRODUCT_TAG.' pt on p.id = pt.product_id
inner join '.TABLE_TAG_TYPE.' tt on pt.tag_type_id = tt.id
where
tt.id = '.PRODUCT_TAG_TYPE_FREE_TAG.'
and p.status = 1
and lower(pt.value) = "cats"
and lower(pt.value) = "kittens"
но это ничего не вернуло. Я понял, что проблема заключалась в конечном условии AND, поэтому вместо этого попытался использовать самосоединение;
select
distinct p2c.product_id
from '.TABLE_PRODUCT_TO_CATEGORY.' p2c
inner join '.TABLE_PRODUCT.' p on p2c.product_id = p.id
inner join '.TABLE_PRODUCT_TAG.' pt on p.id = pt.product_id
inner join '.TABLE_PRODUCT_TAG.' pt2 on p.id = pt2.product_id
inner join '.TABLE_TAG_TYPE.' tt on pt.tag_type_id = tt.id
where
tt.id = '.PRODUCT_TAG_TYPE_FREE_TAG.'
and p.status = 1
and lower(pt.value) = "cats"
and lower(pt2.value) = "kittens"
Теперь все работает как положено, и набор результатов правильный. Так что я хочу знать? Повторяю, результаты, которые мне нужны, - это идентификаторы активных (status = 1) элементов, которые были помечены тегом определенного типа со значениями «cats» И «kittens» ...
- Являются ли самостоятельные объединения лучшим способом достижения этих результатов?
- Этот запрос потенциально может быть огромным (я пропустил условие категории, которого может быть ~ 300), так хорошо ли масштабируется этот подход к самостоятельному объединению? Если нет, есть ли альтернатива?
- Будет ли подход с самостоятельным объединением лучшим способом продвижения вперед (при условии, что есть альтернатива), если я позволю пользователям определять сложные поиски по тегам? то есть "кошки" и ("котята" или "собаки") не "попугаи".