2013-06-12 25 views
0

兩個表中選擇:SQL通過連接表與地方或條款

任務 - ID,creator_id(休息不相關)

tag_tasks - TAG_ID,TASK_ID

我想通過搶任務tag_tasks通過一個標籤ID數組,但也可以抓取具有特定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 

這可能嗎?

謝謝。

回答

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。你真的想要所有的「1,2,3」標籤以及創作者1中的其他30個標籤嗎?正如最後兩個查詢所暗示的那樣(但在問題中沒有提到)?

編輯:

我看着查詢,我看你只是在任務級別檢索信息。如果您正在尋找者希望有一個1,2,或3標籤或1的創建,我會建議使用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; 

這使得它在你要修改的事件更靈活條件。例如,如果你想要所有的標籤或至少兩個標籤。

+0

第一個查詢不返回任務WHERE creator_id = 1,只有那些有tag_task記錄(我原來的問題),這些任務。第二個查詢會產生一個錯誤:「having clause」中的未知列'tasks.creator_id'。無論哪種方式,我都會用我的解決方案編輯我的問題,並感謝您通知我有,我必須查找。 – Squadrons

+1

@Squadrons。 。 。這些問題使用'left outer join'('或'忽略'NULL'值)來解決。儘管你在問題中確實表示「不匹配」,但是我迷惑了自己,並不確定這是否意味着根本沒有匹配的標籤記錄,或者沒有標識符爲1,2或3. –

+0

無論如何,我感覺這種類型加入是什麼導致我的問題。我會閱讀加入以更好地教育自己。感謝您的幫助。 – Squadrons

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

與上面相同的問題 - 此查詢僅返回具有鏈接表(tag_tasks)記錄的任務,而不返回具有creator_id 1的任務和任務 – Squadrons

1

這裏是解決我的問題查詢。我只需要創建一個LEFT JOIN代替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