MySQL: присоединение к таблице, где несколько строк являются частью условия - PullRequest
0 голосов
/ 17 декабря 2018

Попытка выбрать несколько строк в объединенной таблице, где имеется несколько релевантных строк.
Это очень упрощенная версия исходного запроса, поэтому, пожалуйста, никаких предложений по общей структуре таблицы.

ТаблицаA

id, title
------------
1, housea
2, houseb
3, housec
4, housed

Таблица B

id, cid, attrib, val
--------------------
1, 1, bathrooms, 2
2, 1, bedrooms, 1
3, 2, bathrooms, 0
4, 1, pools, 1
5, 2, bedrooms, 1
6, 2, pools, 1
7, 3, bathrooms, 1
8, 4, bathrooms, 1
9, 4, bedrooms, 1

Выберите все объекты, у которых есть хотя бы одна ванная комната и одна спальня.

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

2, housea
4, housed

Это не работает:

SELECT a.id, title
FROM tablea a
LEFT JOIN tableb b ON b.cid = a.id
WHERE (b.attrib = "bathrooms" AND b.val > 0) AND (b.attrib = "bedrooms" AND b.val > 0)

и не это:

SELECT a.id, title
FROM tablea a
LEFT JOIN tableb b1 ON b1.cid = a.id AND (b1.attrib = "bathrooms" AND b1.val > 0) 
LEFT JOIN tableb b2 ON b2.cid = a.id AND (b2.attrib = "bedrooms" AND b2.val > 0) 

Спасибо за ваши предложения!

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Попробуйте запустить коррелированный подзапрос, как указано ниже:

select a.id, a.title from tablea a where 2 >= 
(select count(b.cid) from tableb b where b.cid = a.id and b.attrib in ('bathrooms' , 'bedrooms') and b.val > 0 group by b.cid)
0 голосов
/ 17 декабря 2018

Ваша вторая версия в основном верна, за исключением того, что вам нужны внутренние объединения:

SELECT a.id, a.title
FROM tablea a JOIN
     tableb b1
     ON b1.cid = a.id AND (b1.attrib = 'bathrooms' AND b1.val > 0) JOIN
     tableb b2
     ON b2.cid = a.id AND (b2.attrib = 'bedrooms' AND b2.val > 0) ;

Вся ваша фильтрация содержится в предложениях ON, поэтому строки на самом деле не отфильтровываются.Вы увидите фильтрацию, если посмотрите на столбцы с b1 или b2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...