0

私は3つのMySQLテーブルを持っています。1つはデータ、もう1つはタグ、もう1つはこれら2つの間の関連付けです。これは、タグを保存するときの一般的な方法のようです。テーブルは次のようになります。

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 |
+----+------------+------------+--------+-------------+

すべてがグループ化されているようですが、それは私が探していたものではありません。誰かが解決策を知っていますか?

4

1 に答える 1

2

次のように関数を使用する必要があります。そうしないGROUP BYと、group_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

于 2012-12-15T01:49:27.893 に答える