mysql - 通过链接表从 MySQL 数据库获取与标签关联的行

标签 mysql search tags

我有三个 MySQL 表,一张包含数据,一张包含标签,一张包含这两者之间的关联,这似乎是存储标签时的常见做法。这些表格如下所示:

links:
+----+------------+------------+
| id | url        | added      |
+----+------------+------------+
| 2  | google.com | 2012-12-14 |
| 3  | cnn.com    | 2001-02-13 |
+----+------------+------------+

tags:    
+----+--------+
| id | tag    |
+----+--------+
| 1  | search |
| 2  | news   |
+----+--------+


taglink:
+----+--------+-------+
| id | linkid | tagid |
+----+--------+-------+
| 1  | 2      | 1     |
| 2  | 3      | 1     |
| 3  | 3      | 2     |
+----+--------+-------+

我想要收到的是下表:

+----+------------+------------+--------+-------------+
| id | url        | added      | tagids | tags        |
+----+------------+------------+--------+-------------+
| 2  | google.com | 2012-12-14 | 1      | search      |
| 3  | cnn.com    | 2001-02-13 | 1,2    | search,news |
+----+------------+------------+--------+-------------+

为此,我有以下查询:

select 
   links.*,
   group_concat(taglink.id) as tagids,
   group_concat(tags.tag) as tags
from links
   join taglink on taglink.linkid=links.id
   join tags on tags.id=taglink.tagid

但这给了我一个单独的行,其中包含使用的每个标签,如下所示:

+----+------------+------------+--------+-------------+
| id | url        | addad      | tagids | tags        |
+----+------------+------------+--------+-------------+
| 2  | google.com | 2012-12-14 | 1,2    | search,news |
+----+------------+------------+--------+-------------+

一切似乎都是分组的,这不是我想要的。有谁知道解决办法吗?

最佳答案

您需要将 GROUP BYgroup_concat 函数一起使用,如下所示,否则它们的行为将无法预测。试试这个。

    select links.id, links.url, links.added,
           group_concat(tags.id ORDER BY tags.id) as tagids,
           group_concat(tags.tag ORDER BY tags.id) as tags
      from links
      join taglink on taglink.linkid=links.id
      join tags on tags.id=taglink.tagid
  group by links.id, links.url, links.added
  order by links.id

请注意,我添加了一些 ORDER BY 项以使事物的顺序可预测。

去拨弄:http://sqlfiddle.com/#!2/2b3b9/5/0

关于mysql - 通过链接表从 MySQL 数据库获取与标签关联的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13888516/

相关文章:

python - 将 POS 标签从 TextBlob 转换为 Wordnet 兼容输入

sql - MySQL:根据关联的ID限制输出

mysql - LibreOffice Base 表单通过查询编辑表格

c# - 如何使用C#查询MYSQL数据并显示?

在vim中搜索和替换被拉取的文本的内容

php - 改进 MySQL 数据库的 PHP 搜索?

mysql - 注释每周值

php - MySQL:在多个列中查找相同的字符串

php/mySQL 如何从数据库中获取多个项目的所有标签?

html - 是否有关闭自身的标签的名称?