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

V
На сайте с 10.01.2012
Offline
85
404

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

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

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

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 ----------

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

ДП
На сайте с 23.11.2009
Offline
189
#1

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 вот ссылка

V
На сайте с 10.01.2012
Offline
85
#2

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

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

---------- Добавлено 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'

S
На сайте с 30.09.2016
Offline
459
#3
Varenik:
при условии что pr.uid ='UID-0000-111' И pr.uid ='UID-0000-222'

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

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
ДП
На сайте с 23.11.2009
Offline
189
#4
Varenik:
По факту нужно их просто объединить, чтобы выполнялся поиск при условии что pr.uid ='UID-0000-111' И pr.uid ='UID-0000-222'

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

S
На сайте с 30.09.2016
Offline
459
#5

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

IL
На сайте с 20.04.2007
Offline
412
#6
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..

V
На сайте с 10.01.2012
Offline
85
#7
По идее, при наличии индекса по uid быстрее может оказаться вложенный запрос вроде такого:

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий