1

ご挨拶、

私はgroup_concat関数に非常にトリッキーな問題があり、何日か成功しなかったので、それを解決する方法を考えています。

3 つのテーブルがあります。

tasks                    task_tag                 tag      
+---------+----------+   +---------+----------+   +---------+----------+
| task_id |   data   |   | task_id |  tag_id  |   | tag_id  |   name   |
+---------+----------+   +---------+----------+   +---------+----------+
|       1 | task 1   |   |    1    |    5     |   |    5    |   work   |
|       2 | task 2   |   |    1    |    7     |   |    6    |  school  |
|       3 | task 3   |   |    2    |    6     |   |    7    |   home   |
+---------+----------+   +---------+----------+   +---------+----------+

結果列として関連付けられているすべてのタグを使用して、すべてのタスクを取得する必要がある場合、次のクエリで問題はありません。

SELECT t.task_id, t.data, GROUP_CONCAT(tg.name) AS tags
FROM tasks t
LEFT JOIN task_tag tt ON tt.task_id = t.task_id
LEFT JOIN tag tg ON tg.tag_id = tt.tag_id
GROUP BY t.task_id

result
+---------+-----------+-------------+
| task_id |  data     |   tags      |
+---------+-----------+-------------+
|    1    |  task 1   |  work,home  |
|    2    |  task 2   |  school     |
|    3    |  task 3   |  NULL       |
+---------+-----------+-------------+

問題は、1 つの EXACT タグからタスクを選択する必要がある場合ですが、タスクに関連付けられたすべてのタグを含むタグ列を保持する必要がある場合です。次のクエリを試してみましたが、結果が WHERE tag_id = 5 によって制限されているため、group_concat 関数は id = 5 のタグのみを取得します。たとえば、「work」:

SELECT t.task_id, t.data, GROUP_CONCAT(tg.name) AS tags
FROM tasks t
LEFT JOIN task_tag tt ON tt.task_id = t.task_id
LEFT JOIN tag tg ON tg.tag_id = tt.tag_id
WHERE tg.tag_id = 5
GROUP BY t.task_id

result
+---------+-----------+-------------+   
| task_id |   data    |      tags   |
+---------+-----------+-------------+
|    1    |  task 1   |      work   |
+---------+-----------+-------------+

私が達成しようとしている結果は次のとおりです。

result
+---------+-----------+-------------+   
| task_id |  data     |     tags    |
+---------+-----------+-------------+
|    1    |  task 1   |  work,home  |
+---------+-----------+-------------+

これを解決する方法についての提案をありがとうございました!

4

3 に答える 3

2

これを行うには、最初のクエリを変更して、サブクエリを含む where 句を含めます。

SELECT t.task_id, t.data, GROUP_CONCAT(tg.name) AS tags
FROM tasks t
LEFT JOIN task_tag tt ON tt.task_id = t.task_id
LEFT JOIN tag tg ON tg.tag_id = tt.tag_id
WHERE t.task_id IN (SELECT task_id FROM task_tags WHERE tag_id=5)
GROUP BY t.task_id
于 2010-12-27T18:24:58.160 に答える
1

WHERE 句はすべての単一行に適用されるため、WHERE の代わりに HAVING を使用します。

SELECT t.task_id, t.data, GROUP_CONCAT(tg.name) AS tags
FROM tasks t
LEFT JOIN task_tag tt ON tt.task_id = t.task_id
LEFT JOIN tag tg ON tg.tag_id = tt.tag_id
GROUP BY t.task_id
HAVING Count(IF(tg.tag_id = 5,1,NULL)) > 0
于 2010-12-27T18:25:01.383 に答える
1

あなたが探しているものを理解できれば、あなたが想像していたような結果が得られると思います:

SELECT tasks.task_id, tasks.data, GROUP_CONCAT(tag.name) AS tags
FROM tag AS looking_for
JOIN task_tag AS first_tt ON first_tt.tag_id = looking_for.tag_id
JOIN tasks ON tasks.task_id = task_tag.task_id
JOIN task_tag AS second_tt ON second_tt.task_id = tasks.task_id
JOIN tag ON tag.tag_id = second_tt.tag_id
WHERE looking_for.tag_id = 5
GROUP BY tasks.task_id

探していた最初のタグから始まり、それに関連付けられたタスクに戻り、そのタスクのすべてのタグを結合します。

于 2010-12-27T18:09:56.167 に答える