如何更新此SQL查询以提供我想要的结果?

时间:2013-08-13 17:33:52

标签: mysql innodb

我有两张表如下:

列表表

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级别上这样做吗?

3 个答案:

答案 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;
  • 可能搞砸了桌子名字。我的列表和列表看起来都一样......但一般......