2016-04-05 20 views
2

Kafamı MySQL birleşimlerinde bulmaya çalışıyorum. Ben üç tablo Ben MySQL: Bir tablodaki satırları bul, diğerini değil, her ikisini de bul

  • dışarı çalışmaya çalışıyorum her etkinlik için
    -- events 
    id name 
    1 Event 1 
    2 Event 2 
    
    -- registrations 
    id event name 
    1 1  Alice 
    2 1  Bob 
    3 2  Alice 
    4 2  Charlie 
    
    -- scores 
    id event name  score 
    1 1  Alice 10 
    2 1  Charlie 20 
    3 2  Alice 15 
    4 2  Bob  30 
    

    Kaç (kayıt tablosundaki satırlar) kayıtlı kişiler ancak bir skor (puan tablosunda satırlarını hariç) alamadım
  • kaç kişi (satırlar puan tablosunda) bir skor var ama kayıtlı İKİ
  • kaç kişiyi (kayıt tablosundaki satırları hariç) kayıt dEĞİL vermedi ve skor yaptı
.210

Ben

SELECT * 
FROM registrations r 
LEFT JOIN scores s 
ON  r.event = s.event 
WHERE s.event IS NULL 
AND r.event = 1 

farklı varyasyonlarını denedim ama üzerinde katılmadan gerektiğini emin değilim: event veya name ama hiçbiri boş ve ben Bakıyorum doğru rakamları elde etmek gibi asla için.

 name  reg_only score_only reg&score total 
event Event 1 1  1   1   3 
+0

Eğer * açıklamaya tablo ekleyerek denediniz sizin query- belirtildiği gibi sonunda sonucu olmalıdır? msgstr "r. * kayıtlarından r seçin." Sorun, olay sütununun ilgili tabloların birkaçında mevcut olması olabilir. – Henkealg

cevap

0

Aynı dizide 3 sorguları aşağıda kullanabilirsiniz gibi

SELECT e.id, e.name, COUNT(r.id) AS registered_user 
FROM `events` AS e 
INNER JOIN registrations AS r ON e.id=r.event 
LEFT JOIN scores AS s ON e.id = s.event 
WHERE s.event IS NULL; 

SELECT e.id, e.name, COUNT(r.id) AS scored_user 
FROM `events`scores AS e 
INNER JOIN scores AS s ON e.id=s.event 
LEFT JOIN registrations AS r ON e.id = r.event 
WHERE r.event IS NULL; 

SELECT e.id, e.name, COUNT(*) AS both_user 
FROM `events` AS e 
INNER JOIN registrations AS r ON e.id=r.event 
INNER JOIN scores AS s ON e.id = s.event; 
İlgili konular