1

我有两个表如下:

列表表

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

4

3 回答 3

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子句。

于 2013-08-13T17:55:23.463 回答
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;
  • 可能搞砸了表名。我的列表和列表看起来都一样......但一般......
于 2013-08-13T17:54:31.773 回答
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
于 2013-08-13T17:38:53.550 回答