2017-01-24 5 views
1

Ich habe zwei durch einen Fremdschlüssel verbundene Tabellen:MySQL: Rückkehr nur Zeilen in einer Tabelle, wo sind alle Werte in einer Spalte einer anderen Tabelle die gleiche

main   secondary 
----   --------------------   
id    main_id(FK) | flag 
----   -------------------- 
    1    1   1 
    2    1   1 
    3    1   1 
    4    2   0 
        2   1 
        3   0 
        3   1 
        4   1 
        4   1 

Ich brauche eine Abfrage zu erstellen, die nur für Rückkehr Zeilen von 'main', wenn ihre entsprechenden Zeilen in 'sekundären' ALL ein Flag = 1 haben. In diesem Beispiel sollte die Abfrage nur die Zeilen 1 und 4 von 'main' zurückgeben.

main 
---- 
id 
---- 
    1 
    4 

Ich habe mit COUNTs und NOT EXISTs gespielt, aber ich vermisse hier etwas Grundlegendes. Die grundlegende, abgespeckte Abfrage Ich begann mit ist:

SELECT main.id from main WHERE main.id IN (SELECT secondary.main_id from secondary WHERE flag = 1); 

Welche anderen Bedingungen muss ich einstellen, um meine gewünschte Ergebnis eingestellt werden?

+0

Versuch mit verschieden zu überprüfen – Abhis

+0

Kann die Flagge nur 1 oder 0 sein - oder sind irgendwelche Werte erlaubt? –

+0

@ P.Salmon: Die Flagge kann immer nur 1 oder 0 sein, ja. – Chris

Antwort

3

Sie könnten einen nicht in einem subselect für Flag kann <> 1

SELECT main.id 
from main 
WHERE main.id NOT IN (SELECT secondary.main_id 
          from secondary WHERE flag <> 1); 
+1

Gute Antwort. Sie sollten jedoch "DISTINCT" aus der Unterabfrage entfernen. Sie sollten nur dem DBMS * sagen * was * nicht * wie * es tun soll. –

+0

@ThorstenKettner korrigieren .. danke .. antworten aktualisiert – scaisEdge

+0

Kurz und gut. Scheint soweit zu arbeiten. Das NOT IN war was mir entging. Vielen Dank! – Chris

0

Sie unter Abfrage versuchen verwenden

SELECT id 
FROM (
    SELECT id, COUNT(1) = SUM(CASE WHEN flag = 1 THEN 1 ELSE 0 END) is_valid 
    FROM tableName 
    GROUP by id)t1 
WHERE is_valid = 1; 

Hope this Ihnen helfen würde.

0

Ein weiterer Ansatz, der nicht die Kenntnis der Flag-Werte übernimmt (aber nicht annehmen, dass sie ganze Zahlen sind) wäre, die Mindest- und Höchstwerte von Haupt ID in Ihrem inneren uery

MariaDB [sandbox]> select id 
    -> from main 
    -> where id in 
    -> (
    -> select t.main_id from 
    -> (
    -> select s.main_id,min(s.flag) minflag, max(s.flag) maxflag 
    -> from secondary s 
    -> group by s.main_id 
    ->) t 
    -> where t.minflag = t.maxflag 
    ->) ; 
+------+ 
| id | 
+------+ 
| 1 | 
| 4 | 
+------+ 
2 rows in set (0.00 sec) 
Verwandte Themen