2017-03-23 2 views
0

Ich habe die folgenden Datenbanktabellen.Wie wählt man 1: n bezogene Datensätze, die mindestens 2 pro Typ sind in MySQL

my_left_table 
left_id  name 
1   A 
2   B 
3   C 

my_right_tabe 
right_id thing  left_id_fk status 
1   D   1   new 
2   E   1   new 
3   F   2   old 
4   G   3   old 
5   H   3   new 
6   I   3   new 
7   J   1   old 
8   K   2   old 
9   L   2   new 
10   M   3   old 
11   N   3   old 
12   O   1   new 

Mein gewünschtes Ergebnis ist wie folgt.

my_left_table 
left_id  name 
3   C 

Wie wähle ich die linke Seite Aufzeichnungen, die seine rechte Aufzeichnungen haben AT LEAST 2 statusnew ist UND 2 status ist old. Zum Beispiel ist left_id 1 nicht das Ziel, weil drei seiner rechten Datensätze den Status new haben, aber nur ein Datensatz den Status alt hat.

Bis jetzt habe ich.

SELECT *, COUNT(my_right_tabe.left_id_fk) AS count_left_id_fk 
FROM my_left_table 
INNER JOIN my_right_tabe 
ON my_left_table.id = my_right_tabe.left_id_fk 
GROUP BY my_right_tabe.left_id_fk 

Antwort

2

Verwenden Sie die HAVING-Klausel in MySQL Wie die folgende

SELECT my_left_table.left_id, my_left_table.name 
FROM my_left_table 
INNER JOIN my_right_tabe 
ON my_left_table.left_id = my_right_tabe.left_id_fk 
GROUP BY my_right_tabe.left_id_fk 
HAVING SUM(my_right_tabe.status="new") >= 2 AND 
     SUM(my_right_tabe.status="old") >= 2 
+0

Es gibt eine weitere Sache, die ich vergaß zu erwähnen. Der Status ist mehr als nur neu und alt, sondern dynamisch. Ich kann nicht sagen, was diese Statuswerte sind. Wie löst man das? –

+0

Dann sollten Sie sich ansehen, was Samir in der anderen Antwort geschrieben hat, aber wenn Sie möchten, dass es vollständig dynamisch ist, müssten Sie die having-Klausel folgendermaßen ändern: HAVING SUM (status_calc) = (SELECT COUNT (DISTINCT (status)) FROM my_right_tabe); – user1898027

1

Sie die gewünschten Ergebnisse erzielen können, indem zuerst die Werte gruppieren und dann seine Gesamt überprüfen. Wenn sein> = 2, ziehen Sie diesen Datensatz.

Hier ist die Abfrage

SELECT z.* 
FROM 
(
    SELECT a.left_id, name, status, IF(COUNT(*) >=2, 1, 0) AS status_calc 
    FROM my_left_table a JOIN my_right_table b 
    ON a.left_id = b.left_id_fk 
    GROUP BY left_id, status 
) z 
GROUP BY z.left_id 
HAVING SUM(status_calc) = 2; 

Working Demo

Verwandte Themen