首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mysql左连接子选择

mysql左连接子选择
EN

Stack Overflow用户
提问于 2012-09-17 21:15:26
回答 2查看 202关注 0票数 1

我有一个表格,格式如下:

代码语言:javascript
运行
复制
tag | item
----------
1   | 1
2   | 2
2   | 3
3   | 1
3   | 2
3   | 3

我必须选择那些标签,这些标签出现在每个标签的项目集中。

例如:

items={ 2,3 } -->标签{2,3},项目2具有标签2,3,项目3具有标签2,3,通用标签为2,3

items={1,2,3} -->标签{},项目1具有标签1,3,项目2具有标签2,3,项目3具有标签2,3,通用标签为3

items={1,3} -->标签{3},项目1具有标签1,3,项目3具有标签2,3,通用标签为3

作为输入,我有一组项目。我不知道如何编写这样的查询。

感谢您的回复。

EN

回答 2

Stack Overflow用户

发布于 2012-09-17 22:31:18

我想您正在寻找共享相同标签的项目列表,对吧?

此查询应该可以为您完成此操作。它由一个内部摘要查询和一个外部摘要查询组成,前者将每个项目的标签分组在一起,后者将共享标签组的项目分组在一起。

代码语言:javascript
运行
复制
SELECT GROUP_CONCAT(item ORDER by ITEM) items, tags
  FROM (
           SELECT GROUP_CONCAT(tag ORDER BY tag) tags, item
             FROM tbl
         GROUP BY item
        )t
  GROUP BY tags
  ORDER BY tags 

对于您的问题中的测试数据集,它将返回:

代码语言:javascript
运行
复制
| ITEMS | TAGS |
----------------
|     1 |  1,3 |
|   2,3 |  2,3 |

也就是说,您的项目1具有标记1和3。您的项目2和3具有标记2和3。

去小提琴!http://sqlfiddle.com/#!2/6a927/3/0

票数 1
EN

Stack Overflow用户

发布于 2012-09-17 22:04:41

解决问题的查询是(假设标签和项目没有重复的条目)

代码语言:javascript
运行
复制
SELECT tag FROM <table_name>
WHERE item IN (<items to be searched seperated by ,>)
GROUP BY tag
HAVING COUNT(*) = <number of items>;

例如,项{1,3}

代码语言:javascript
运行
复制
SELECT tag FROM <table_name>
WHERE item IN (1,3)
GROUP BY tag
HAVING COUNT(*) = 2;

对于项目{1,2,3}

代码语言:javascript
运行
复制
SELECT tag FROM <table_name>
WHERE item IN (1,2,3)
GROUP BY tag
HAVING COUNT(*) = 3;

要查看由逗号分隔的结果,请使用以下查询

代码语言:javascript
运行
复制
SELECT GROUP_CONCAT(a.tag) FROM (
SELECT tag FROM <table_name>
WHERE item IN (<items to be searched seperated by comma>)
GROUP BY tag
HAVING COUNT(*) = <no. of items>) AS a;

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12460008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档