带有标签的项目列表视图的MySQL查询

时间:2014-04-25 10:02:14

标签: mysql sql tagging

您对此结果的正确查询是什么:

+---------------------------------------+
item_id | item_title | tag_list         |
----------------------------------------+
1       |  Title 1   | tag1 , tag2, tag3|
2       |  Title 2   | tag7 , tag2      |
3       |  Title 3   | tag9 , tag5, tag4|
4       |  Title 4   | tag7 , tag6, tag3|
-----------------------------------------

我有以下表格:

  • 项目 - > item_id(PK),item_title
  • 标签 - > tag_id(PK),tag_name(唯一)
  • items_tags_xref - > items_tags_xref_id(PK),item_id,tag_id

SQL小提琴 - > http://sqlfiddle.com/#!2/33dea8/1

我尝试了以下查询但没有成功:

SELECT 
items.item_id, 
items.title, 
(
    SELECT GROUP_CONCAT(DISTINCT tags.tag_name)
        FROM tags 
            INNER JOIN items_tags_xref 
                ON tags.tag_id = items_tags_xref.tag_id
            INNER JOIN items
                ON items_tags_xref.item_id = items.item_id
        WHERE items_tags_xref.item_id = items.item_id

) AS tag_list
FROM items

上述查询的结果显示了tag_list

中的所有tag_names

但是如果我这样做的话:

SELECT 
items.item_id, 
items.title, 
(
    SELECT GROUP_CONCAT(DISTINCT tags.tag_name)
        FROM tags 
            INNER JOIN items_tags_xref 
                ON tags.tag_id = items_tags_xref.tag_id
            INNER JOIN items
                ON items_tags_xref.item_id = items.item_id
        WHERE items_tags_xref.item_id = 4

) AS tag_list
FROM items

“4是一个特定的item_id”我只得到该项目的正确结果。如果我在tag_list ..

中使用items.item_id时只有4是动态的

我正试图解决这个问题好几天,一直在谷歌搜索答案,但找不到任何东西。也许我使用了错误的关键字:(但如果有人能给我至少一个关于如何做到这一点的提示。这将非常有帮助。谢谢!

  • P.S。我是mysql的新手

1 个答案:

答案 0 :(得分:0)

我有点困惑,问题的哪个部分会导致以下问题无法解决?

SELECT i.*
     , GROUP_CONCAT(tag_name) tags
  FROM items i
  JOIN items_tags_xref it
    ON it.item_id = i.item_id
  JOIN tags t
    ON t.tag_id = it.tag_id
 GROUP
    BY i.item_id;

http://sqlfiddle.com/#!2/33dea8/6

此外,items_tags_xref表上的代理键似乎完全是多余的,因为其余列将作为完全可行的复合自然PRIMARY KEY