2011-12-08 19 views
24

Tamam, bu yüzden userID ve taskID içeren bir geçici tablo var. Bu CompletedTasks denir. UserID ve taskID içeren ikinci bir tablom var. PlannedTasks denir.mysql "Nerede değil" iki sütun kullanarak

Tamamlanmış, ancak planlanmamış olan tüm görev kimliklerinin bir listesini almam gerekir. Bu yüzden, her ikisi de PlannedTasks.userID != CompletedTasks.userID AND PlannedTasks.taskID != CompletedTasks.taskID'un bulunduğu tüm satırlardaki tamamlanmış görevlerden ayrılmam gerekiyor.

Umarım bu soru anlamlıdır. Eğer belirsiz ise lütfen bana bildirin ve daha fazla açıklayacağım.

Teşekkürler!

+0

Sanırım durumu göstermek için ek bir sütuna ihtiyacınız var, gerçekten iki tabloya ihtiyacınız yok. – ajreal

+0

@ajreal Bu iyi bir nokta. Belki de şemayı önerdiğiniz şekilde değiştirmeyi düşüneceğim. Bahşiş takdir edin! – PFranchise

+1

Bir tablo üzerinde 2 tablo ve bir durum sütunu, zamanın% 99'unu tercih ederim. Ve bir masa ve 10 durum sütunu üzerinde 11 tablo. Bir veya daha fazla durum sütununu (MysQL'de) arayan bir sorguyu optimize etmek kolay değildir. –

cevap

62
Bu (daha kompakt bir sözdizimi) kullanabilir

: (daha karmaşık olmasına rağmen, uygun endeksler ile daha verimli olmalıdır)

SELECT * 
FROM CompletedTasks 
WHERE (userID, taskID) NOT IN 
     (SELECT userID, taskID 
     FROM PlannedTasks 
    ) ; 

veya NOT EXISTS sürümü:

SELECT c.* 
FROM CompletedTasks AS c 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM PlannedTasks AS p 
     WHERE p.userID = c.userID 
      AND p.taskID = c.taskID 
    ) ; 

ve tabii @jmacinnes'in cevabında bulunduğu LEFT JOIN/IS NULL sürümü. Benim sorun çözüldü

SELECT * FROM CompletedTasks WHERE (userID, taskID) NOT IN 
     (SELECT userID, taskID FROM PlannedTasks) ;' 

söz sorgusu altında paylaşımı için ypercubeᵀᴹ teşekkür @

+0

Harika! Çok teşekkür ederim. Bu şekilde iki alanda nerede kullanabileceğinizi bilmiyordum, ama bunun bir seçenek olacağını umuyordum. Tekrar teşekkürler ve iyi günler! – PFranchise

+0

Testlerimin ardından NOT EXISTS sürümü, NOT_IN sürüm –

+0

@ Ka'dan daha hızlıdır. evet, bir tuple ile "DEĞİL", "DEĞİLDİR" gibi iyi optimize edilmemiştir. Hangi sürümü test ettiniz? Yeni 5,7 sürümünde optimize ediciyi geliştirdiler mi test etmedim. –

5

İhtiyacınız olan bu mu?

select ct.* from 
completedTasks ct 
left outer join plannedTasks pt on ct.taskId = pt.TaskId and ct.userId = pt.userId 
where pt.taskId is null 

Ancak, ben yorum katılıyorum - bir durum sütunu iki tablo daha iyi bir şema gibi geliyor sorudan bildiklerini verilen.

0

.

+0

Bu bir yorum olmalı, bir yanıt olmamalıdır :) – sniperd

+0

Aslında, @ypercube paylaşılan sorguya referansla bazı değişiklikler yaptım. Gelecekte ilgilenecek. Teşekkürler –