0

upload、tag、upload_tagの3つのテーブルがあります。Uploadはファイルのアップロードの詳細を保持し、tagはタグ名を保持し、upload_tagはアップロードIDをタグIDに一致させるルックアップテーブルです。

+--------------------------------------------------------+
| upload                                                 |
+--------------------------------------------------------+
|id         |name                                        |
+-----------+--------------------------------------------+
|1          |file_1.jpg                                  |
+-----------+--------------------------------------------+
|2          |file_2.doc                                  |
+-----------+--------------------------------------------+

+--------------------------------------------------------+
|tag                                                     |
+--------------------------------------------------------+
|id         |name                                        |
+-----------+--------------------------------------------+
|1          |a_tag                                       |
+-----------+--------------------------------------------+
|2          |b_tag                                       |
+-----------+--------------------------------------------+
|3          |c_tag                                       |
+-----------+--------------------------------------------+

+--------------------------------------------------------+
|upload_tag                                              |
+-----------+--------------------------------------------+
|upload_id  |tag_id                                      |
+-----------+--------------------------------------------+
|1          |1                                           |
+-----------+--------------------------------------------+
|1          |2                                           |
+-----------+--------------------------------------------+
|2          |3                                           |
+-----------+--------------------------------------------+
|2          |2                                           |
+-----------+--------------------------------------------+

タグの文字列を使用してデータベースからアップロードをプルする必要がありますが、すべて1行になっているため、結果は次のようになります。

+----------------------------------------------------+
|filename      |tags                                 |
+--------------+-------------------------------------+
|file_1.jpg    |a_tag; b_tag                         |
+--------------+-------------------------------------+
|file_2.doc    |c_tag; b_tag                         |
+--------------+-------------------------------------+

現時点では、これを行うための最良の方法は、アップロードIDを受け取り、フォーマットされたタグの文字列を返すMySQL関数を作成することだと考えています。私はここで正しいですか、それともこれを達成するためのより良い方法がありますか?

4

2 に答える 2

2

LEFT JOIN句とGROUP_CONCAT()関数を使用する必要があります。

SELECT          u.name AS filename,
                GROUP_CONCAT(t.name SEPARATOR '; ') AS tags
    FROM        upload u
    LEFT JOIN   upload_tags ut
        ON      u.id = ut.upload_id
    LEFT JOIN   tag t
        ON      t.id = ut.tag_id
    GROUP BY    u.id;

GROUP_CONCATは集計関数です。つまり、複数の列で機能するのではなく、複数の行(グループとして編成)CONCATで機能します。

于 2012-06-28T10:51:17.517 に答える
1

これを試して ::

select 
upload.name as filename
GROUP_CONCAT(tag.name SEPARATOR '; ') as tags
from 
upload_tag ut 
inner join upload  on (ut.upload_id = upload.id)
inner join tags on (ut.tag_id = tags.id) 
group by ut.upload_id
于 2012-06-28T10:57:35.823 に答える