2017-03-23 1 views
0

J'ai les tables de base de données suivantes.Comment sélectionner 1: n enregistrements liés qui sont minimum 2 par type en 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 

Mon résultat souhaité est le suivant.

my_left_table 
left_id  name 
3   C 

Comment puis-je sélectionner les enregistrements gauche qui ses dossiers ont droit AT LEAST 2 status est new ET 2 status est old. Par exemple, left_id 1 n'est pas la cible car trois de ses enregistrements de droite ont le statut new mais un seul enregistrement a le statut old.

Jusqu'ici je l'ai.

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 

Répondre

2

Utilisez la clause HAVING dans MySQL comme ce qui suit

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

Il y a une chose que j'oublié de mentionner. Le statut est plus que nouveau et ancien, mais dynamique. Je ne peux pas dire quelles sont ces valeurs de statut. Comment résoudre cela? –

+0

Ensuite, vous devriez regarder ce que Samir a écrit dans l'autre réponse, mais si vous voulez que ce soit totalement dynamique, vous devriez changer la clause having à: HAVING SUM (status_calc) = (SELECT COUNT (DISTINCT (statut)) FROM my_right_tabe) – user1898027

1

Vous pouvez obtenir les résultats escomptés d'abord regrouper les valeurs et vérifiez sa totale. Si c'est> = 2 tirer cet enregistrement.

Voici la requête

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