【问题标题】:mysql left join subselectmysql左连接子选择
【发布时间】:2012-09-17 13:15:25
【问题描述】:

我有这种格式的表格:

tag | item
----------
1   | 1
2   | 2
2   | 3
3   | 1
3   | 2
3   | 3

我必须选择那些标签,它们存在于每个项目的集合中。

例如:

items={2,3} --> tags{2,3},item 2有tags 2,3,item 3有tags 2,3,常见的tags是2,3

items={1,2,3} --> tags{},item 1有tags 1,3,item 2有tags 2,3,item 3有tags 2,3,常见的tags是3

items={1,3} --> tags{3},item 1有tags 1,3,item 3有tags 2,3,常用tags是3

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

感谢您的回复。

【问题讨论】:

  • 所以你给出了一个项目列表并且你想要那个列表的通用标签?还是只是项目和常用标签的列表?
  • 我有一个项目列表并想要一个通用标签

标签: mysql database select


【解决方案1】:

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

这个查询应该为您完成。它由将每个项目的标签组合在一起的内部摘要查询和将共享标签组的项目组合在一起的外部摘要查询组成。

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 

它会为您问题中的测试数据集返回:

| ITEMS | TAGS |
----------------
|     1 |  1,3 |
|   2,3 |  2,3 |

也就是说,您的商品 1 有标签 1 和 3。您的商品 2 和 3 有标签 2 和 3。

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

【讨论】:

  • 我有一个项目列表,我想找出哪些项目共享相同的标签,我不是在寻找所有的可能性。
【解决方案2】:

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

SELECT tag FROM <table_name>
WHERE item IN (<items to be searched seperated by ,>)
GROUP BY tag
HAVING COUNT(*) = <number of items>;

例如对于项目 {1,3}

SELECT tag FROM <table_name>
WHERE item IN (1,3)
GROUP BY tag
HAVING COUNT(*) = 2;

对于项目 {1,2,3}

SELECT tag FROM <table_name>
WHERE item IN (1,2,3)
GROUP BY tag
HAVING COUNT(*) = 3;

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

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;

希望对你有帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多