2012-10-08 149 views
1

這裏是一個複雜的嗎? (至少對我來說)。我有一個名爲「門票」的表,其中「id」列是唯一鍵。我有另一個名爲「標籤」的表,它沒有一個唯一的鍵(從它的外觀)。在「門票」中,我們存儲門票信息(消息,誰製作門票等)。我們可以在創建標籤時爲標籤添加標籤,以便我們可以使用這些標籤搜索標籤,例如「稍後再評論」。MySQL返回反向?搜索結果或結果不包含

我在做什麼,是一個反向查詢例如向我顯示所有沒有與其關聯的特定標籤的門票,例如不要讓我看到「稍後再評論」的任何票。如果門票沒有任何標籤放在標籤表中。我只是無法通過手動或使用查詢生成器來編寫任何類型的查詢。

即時消息我的圖片,你可以看到Tickets.id有174反對它,這也顯示在Labels.ticket_id 174與2 x標籤設置反對它。

不管是什麼查詢,加盟,確實,沒有等我試試,我要麼回來沒有結果,或者一些奇怪的原因,我仍然得到174票顯示出來。

這是我嘗試過的最簡單的查詢..但是,我認爲我現在已經從簡單到非常複雜的嘗試了大約30次迭代。

SELECT tickets.id 
    FROM 
     tickets, labels_tickets 
    WHERE 
     tickets.id <> labels_tickets.ticket_id 
    GROUP BY 
     tickets.id 

任何人都可以說明爲什麼這難道不工作,或認爲任何方法來建立一個statment,上面寫着:

告訴我從門票,這並不帶有標籤「MyLabel」或可是沒有一個所有tickets.id值在所有標籤表中。

非常感謝!

回答

1
SELECT tickets.id 
    FROM 
     tickets 
    WHERE 
     tickets.id NOT IN (SELECT ticket_id from labels_tickets where labels_tickets.label = 'out of hours' or labels_tickets.label = null) 
    GROUP BY 
     tickets.id 

試試這個我認爲它會工作。

+0

我也給了一個去吧! Thankyou ...這已經讓我堅持了好幾個小時了! – Will

+0

如果'labels_tickes.ticket_id'包含NULL值,這將返回不正確的結果。如果這是可能的,那麼'where ticket_id不爲空'應該被添加到子選擇中。 –

+0

這似乎是工作。我改變了上面的查詢來反映我的標籤之一,也是空值!非常感謝。 – Will

0

您可以執行outer join並僅選擇在labels_tickets表中找不到ticket_id的票。

SELECT t.id 
FROM tickets t 
LEFT OUTER JOIN labels_tickets l ON t.id = l.ticket_id 
WHERE l.ticket_id IS NULL 
GROUP BY t.id 
HAVING sum(l.label = 'review later') = 0 

this JOIN examples

+0

我認爲..從它的外觀..工作!我嘗試了一個左外部連接並搜索了null!我要進行一些測試,如果一切順利,我會回覆接受的答案!謝謝! – Will

+0

這就近了!它確實會返回沒有列在「標籤」表中的所有票證......但不允許我選擇過濾標籤數據庫中的某個關鍵字,例如「稍後審查」..我現在想着如何添加一個AND或OR或其他東西來做到這一點? – Will

+0

請嘗試我的更新。 –

0

下獲取沒有ReviewLater標籤的所有門票:

SELECT lt.ticket_id 
FROM labels_tickets 
group by lt.ticket_id 
having sum(case when label = 'ReviewLater' then 1 else 0 end) = 0 

這會將所有標籤爲一組。總和計算具有所需標籤的數字。你需要這個計數爲0的那個。

我強烈建議使用group byhaving來處理這樣的set-membership類型的查詢。它很容易推廣到標籤存在與否的任意組合。

+0

管理得到它與阿布的答案。非常感謝您的幫助! – Will