我有两张表如下:
列表表
listing_id
----------
111111
111113
listings_features_table
id listing_id feature_id
------------------------------
1 111111 4
2 111111 1
5 111113 9
6 111113 1
7 111113 4
我试图只获得具有我指定的所有feature_id的结果。所以在我的情况下,如果我指定(1,4,9),那么只有listing_id 111113
在feature_id列中有这些,这就是我要返回的内容。
我在我的查询中尝试过使用IN,但它等同于OR,这就是为什么会得到错误的结果。
以下是我正在使用的查询:
SELECT * FROM listings_features
JOIN listings ON listings.listing_id=listings_features.listing_id
WHERE listings_features.feature_id IN (1,4,9) GROUP BY listings.listing_id
给出了这个结果:
id listing_id feature_id listing_id
----------------------------------------------
1 111111 4 111111
5 111113 9 111113
我可以用任何方式来获得以下结果:
id listing_id feature_id listing_id
----------------------------------------------
5 111113 1, 4, 9 111113
或者我应该在php级别上这样做吗?
答案 0 :(得分:2)
以下是使用group_concat()
进行比较的技巧:
SELECT *
FROM listings_features lf JOIN
listings l
ON l.listing_id = lf.listing_id
WHERE lf.feature_id in (1,4,9)
GROUP BY l.listing_id
HAVING group_concat(distinct lf.feature_id order by lf.feature_id) = '1,4,9';
如果您需要这些功能但不关心其他功能,请删除where
子句。
答案 1 :(得分:0)
注意:您必须知道功能的数量并相应地调整3。但既然你知道你正在寻找1,4,9,你知道你有3个所以传递一个变量来计算并填充它应该不难。
SELECT ID, Listing_Features.Listing_Id, group_Concat(Feature_ID), Listings.Listing_Id
FROM listings_features
JOIN listings ON listings.listing_id=listings_features.listing_id
WHERE listings_features.feature_id IN (1,4,9) GROUP BY listings.listing_id
GROUP BY Listing_Features.ID, Listing_Features.Listing_Id, Listings.Listing_Id FROM listings_features
HAVING count(*) = 3
答案 2 :(得分:0)
SELECT ID, MAX(Listings_features.Listing_ID), group_concat(Feature_ID), MAX(Listings.Listing_ID) from Listings_Features
inner join Listings USING (listing_id)
WHERE Listings_Features.feature_id IN(1,4,9)
GROUP BY ID;