问一个sql查询问题,用的是mysql数据库

现在这么一个表,要怎么获取在tagId字段同时包含1,2,3,4的结果集的goodsId?
id | tagId | goodsId |gname
1 | 1 | 1 | 电视
2 | 2 | 1 | 电视
3 | 3 | 1 | 电视
4 | 1 | 2 | 冰箱
5 | 2 | 2 | 冰箱
6 | 3 | 2 | 冰箱
7 | 4 | 2 | 冰箱
排版不好,上个截图:
图片描述

阅读 3.9k
5 个回答
select goodsId from (
    select goodsId,GROUP_CONCAT(tagId) as tags from tags group by goodsId order by tagId desc 
) as T
WHERE FIND_IN_SET('1',tags) and FIND_IN_SET('2',tags) and FIND_IN_SET('3',tags) and FIND_IN_SET('4',tags)


select goodsId from (
    select goodsId,GROUP_CONCAT(tagId) as tags from tags group by goodsId order by tagId desc 
) as T
WHERE tags = '1,2,3,4'

用一条SQL恐怕很难搞定,可以考虑以下两个方法:

方法一:把每个tag_id当成表的属性,表结构应该具有这样的形式:

id, tag_id_1, tag_id_2, tag_id_3, tag_id_4, goods_id, goods_name

这样就好查了:

SELECT ... FROM ... WHERE tag_id_1 = 1 AND tag_id_2 = 1 AND tag_id_3 = 1 AND tag_id_4 = 1

方法二:用4个查询:、

SELECT goods_id FROM ... WHERE tag_id = 1
SELECT goods_id FROM ... WHERE tag_id = 2
SELECT goods_id FROM ... WHERE tag_id = 3
SELECT goods_id FROM ... WHERE tag_id = 4

取四个结果集的交集。有个叫INTERSECT的关键字,跟UNION相似但取的是交集,我从来没用过,你可以试试用它把以上四条SQL串在一起。

Postgres支持数组类型,你的需求就可以用group by表达为:

select goodsid from t(tagid, goodsid)
group by goodsid
having array_agg(tagid) @> array[1,2,3,4];

也即按goodsid分组,把组内tagid聚合为一个数组,筛选出tagid数组包含{1,2,3,4}的那些goodsid。结果:

 goodsid
---------
       2
(1 行记录)

你可以把 sql语句的 while出来 然后用一个数组装起来就可以呀

列如
while($row = mysql_fetch_array($result)){

$data[$row['tagId']][] = $row['goods_id'];

}

print_r($data);

select groupid from 表名 where tagid in (1,2,3,4)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题