Помогите с запросом к БД


Varenik
408

Доброго времени суток.

Есть вот такая структура БД:

Помогите с запросом к БД

Как исходя из нее можно выполнить запрос по такой логике?

1. Выбрать products->name, где properties->uid равно нескольким значениям (properties->uid=»value1″, а также properties->uid=»value2″ )

2. Выбрать все уникальные section->uid=”XXX” —> properties->name, для имеющихся products->uid —> properties->uid=»value1″

Заранее благодарю за помощь.

———- Добавлено 29.04.2020 в 22:35 ———-

Никто ниче никак?


Дикий пионер

1. select producs.name from products inner join product_feature on products.uuid = product_feature.product_uid

inner join properties on product_feature.properties.uuid = properties.uid

where (properties.uid = «value1» OR properties.uid = «value2»)

2. не понял вопроса, поясните на примере.

Картинка, кстати, не грузится с первого раза: https://image.prntscr.com/image/EkcOJ9QYQ9yssaND0HSLzA.png вот ссылка


Varenik

В вашем запросе нужно чтобы било не ИЛИ а И.

Если нужно, могу скинуть дамп БД

———- Добавлено 30.04.2020 в 17:15 ———-

По факту есть рабочий запрос, вида:

select distinct p.name from products p
inner join product_feature prf on p.uid = prf.product_uid
inner join properties pr on prf.properties_uid = pr.uid
where pr.uid = 'UID-0000-111'

и

select distinct p.name from products p
inner join product_feature prf on p.uid = prf.product_uid
inner join properties pr on prf.properties_uid = pr.uid
where pr.uid = 'UID-0000-222'

По факту нужно их просто объединить, чтобы выполнялся поиск при условии что pr.uid =’UID-0000-111′ И pr.uid =’UID-0000-222′


Sitealert

Varenik:
при условии что pr.uid =’UID-0000-111′ И pr.uid =’UID-0000-222′

А чё, так можно? 🤪


Дикий пионер

Varenik:
По факту нужно их просто объединить, чтобы выполнялся поиск при условии что pr.uid =’UID-0000-111′ И pr.uid =’UID-0000-222′

Тогда два раза джойнить через алиасы


Sitealert

Можно ещё вложенным запросом, если я правильно понял ТС, но это тормоз будет жуткий. Джойном однозначно будет быстрее. Или скриптом разбирать простую выборку.


ivan-lev

inner join properties pr on prf.properties_uid = pr.uid
where pr.uid = ‘UID-0000-222’

Зачем JOIN-ить лишнюю таблицу по полю, и потом его проверять в «соседней» таблице?

Sitealert:
Можно ещё вложенным запросом, если я правильно понял ТС, но это тормоз будет жуткий

По идее, при наличии индекса по uid быстрее может оказаться вложенный запрос вроде такого:

SELECT products.name FROM products WHERE 
uid IN (SELECT product_uid FROM product_feature pf WHERE pf.uid='value1') AND
uid IN (SELECT product_uid FROM product_feature pf WHERE pf.uid='value2') AND

Или ещё интереснее — вложенным сделать 2 INNER JOIN pf по uid..


Varenik

По идее, при наличии индекса по uid быстрее может оказаться вложенный запрос вроде такого:

Спасибо. Навело на мысли… Буду пробовать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *