我有一个列表数据库。我还有一个listing_attributes数据库,如下所示:
id | listing_id | attribute_id
基本上,listings_attributes表存储分配给某个列表的属性。
我想根据他们拥有的属性来过滤列表。
一个例子是我想要找到属性为1的所有列表。这很容易。
SELECT l.id FROM listings AS l
LEFT JOIN listings_attributes AS la ON l.id = la.listing_id
WHERE la.attribute_id = 1
GROUP BY l.id
我的问题是如何提取属性为1和2的列表。如果列表中的attribute_id为1但没有attribute_id为2,我不希望这些是退出了数据库。
但是,如果列表中的attribute_id为1,2和3,我希望将这些列表从数据库中拉出来。
这是我正在玩的SQL,但是attribute_id之间的“OR”不起作用,“AND”也没有。
SELECT l.id FROM listings AS l
LEFT JOIN listings_attributes AS la ON l.id = la.listing_id
WHERE (la.attribute_id = 1 OR la.attribute_id = 2)
GROUP BY l.id
我需要哪些代码才能使其按照我上面解释的方式工作?
答案 0 :(得分:1)
在查找多个属性时,您需要使用GROUP BY
和OR
来确保listings_attributes
表中的属性都存在,就像您已经拥有的那样。然后添加HAVING
子句以确保多个行匹配。像这样:
SELECT l.id FROM listings AS l
LEFT JOIN listings_attributes AS la ON l.id = la.listing_id
WHERE (la.attribute_id = 1 OR la.attribute_id = 2)
GROUP BY l.id HAVING COUNT(*) = 2