0

2 つのテーブル:

タスク - id、creator_id (残りは関係ありません)

tag_tasks - tag_id、task_id

タグIDの配列を介してtag_tasksを介してタスクを取得したいのですが、特定のcreator_idを持つタスクも取得します。

これが私が現在実行しているステートメントです(それは機能していません):

SELECT tasks.id, tasks.content
FROM  `tasks` 
JOIN tag_tasks ON tasks.id = tag_tasks.task_id
WHERE (
  `tag_tasks`.`tag_id` 
  IN (1,2,3)
)
OR tasks.creator_id =1
GROUP BY tasks.id
ORDER BY  `tasks`.`id` DESC

これにより、tag_tasks テーブルを介してタスクが返されますが、結合テーブルにレコードがないタスクは無視されます。

私が望むのは、これを行う単一のクエリです:

SELECT tasks.id, tasks.content
    FROM  `tasks` 
    JOIN tag_tasks ON tasks.id = tag_tasks.task_id
    WHERE (
      `tag_tasks`.`tag_id` 
      IN (1,2,3)
    )
    GROUP BY tasks.id
    ORDER BY  `tasks`.`id` DESC;

SELECT tasks.id, tasks.content
FROM tasks
WHERE tasks.creator_id =1
GROUP BY tasks.id
ORDER BY  `tasks`.`id` DESC 
LIMIT 0 , 30

これは可能ですか?

ありがとうございました。

4

3 に答える 3

2

通常の結合が機能します。条件を次のように変更しますor

SELECT tasks.id, tasks.content
    FROM  `tasks` left outer join
          tag_tasks
          ON tasks.id = tag_tasks.task_id
    where `tag_tasks`.`tag_id` IN (1,2,3) or tasks.creator_id = 1
    GROUP BY tasks.id
    ORDER BY  `tasks`.`id` DESC;

それは完全なリストを取得します。これを全体で 30 に制限できます。最後の 2 つのクエリで示唆されているように (ただし、実際には質問で言及されていません)、作成者 1 の他の 30 個のタグと一緒にすべての「1、2、3」タグが本当に必要ですか?

編集:

クエリを見ると、タスク レベルでのみ情報を取得していることがわかります。1、2、または 3 のタグを持つ、または 1 によって作成された ask を探している場合は、having 句を使用することをお勧めします。

SELECT tasks.id, tasks.content
    FROM  `tasks` left outer join
          tag_tasks
          ON tasks.id = tag_tasks.task_id
    GROUP BY tasks.id
    having tasks.creator_id = 1 or sum(tag_id in (1, 2, 3)) > 0
    ORDER BY  `tasks`.`id` DESC;

これにより、条件を変更したい場合により柔軟になります。たとえば、すべてのタグまたは少なくとも 2 つのタグが必要な場合です。

于 2013-06-12T18:37:55.573 に答える
1

これを使用してください:

SELECT tasks.id, tasks.content
FROM  `tasks` 
JOIN tag_tasks ON tasks.id = tag_tasks.task_id
WHERE (
  `tag_tasks`.`tag_id` 
  IN (1,2,3) 
  OR tasks.creator_id =1
)
GROUP BY tasks.id
ORDER BY  `tasks`.`id` DESC
于 2013-06-12T18:38:20.450 に答える
1

これが私の問題を解決したクエリです。JOIN 句の代わりに LEFT JOIN を作成する必要がありました。

SELECT tasks.* 
FROM `tasks` 
LEFT JOIN tag_tasks on tasks.id = tag_tasks.task_id 
WHERE (tag_tasks.tag_id IN (517) OR creator_id = 658) 
GROUP BY tasks.id 
ORDER BY tasks.created_at DESC
于 2013-06-12T20:03:40.490 に答える