2010-01-28 5 views
0

Je tableau suivant:Aide requête MySQL pour sélectionner uniquement les enregistrements ayant une valeur spécifique dans la colonne

+--------+-----------+--------+ 
| ID | Title | Stat | 
+--------+-----------+--------+ 
| 1 | title a | 1 | 
+--------+-----------+--------+ 
| 1 | title b | 0 | 
+--------+-----------+--------+ 
| 2 | title c | 1 | 
+--------+-----------+--------+ 
| 2 | title d | 1 | 
+--------+-----------+--------+ 
| 3 | title e | 0 | 
+--------+-----------+--------+ 
| 3 | title f | 1 | 
+--------+-----------+--------+ 
| 3 | title g | 1 | 
+--------+-----------+--------+ 

Je dois construire une requête, où à la suite que les enregistrements seraient inclus lorsque TOUTES valeurs dans la colonne Stat répondent à certaines conditions.

Pour le tableau ci-dessus, comment formuler une requête qui signifierait fondamentalement: afficher les enregistrements pour seulement les ID qui ont toutes les valeurs dans la colonne Stat = 1 et produirait par conséquent le tableau suivant?

+--------+-----------+--------+ 
| 2 | title c | 1 | 
+--------+-----------+--------+ 
| 2 | title d | 1 | 
+--------+-----------+--------+ 

Merci.

+3

Hmm ... une colonne d'identification non-unique. Je m'inquiète. –

+0

@middaparka: Personne n'a dit que l'ID est la clé primaire ici; c'est peut-être une clé étrangère. Cela dit, je suis également curieux de savoir comment on peut se retrouver avec une colonne non-unique appelée ID (en supposant que c'est bien nommé). @Ales: vous obtiendrez peut-être une meilleure réponse si vous nous en dire plus sur le schéma de l'application/de la base de données. – Martijn

+0

Il est en fait nommé différemment (id_member) et c'est une clé étrangère. Fondamentalement, j'ai table avec les membres et une autre table avec des livres que ces membres ont prêtés. La table des prêts a une clé: (id_member, id_book). Chaque livre peut être marqué comme retourné (1) ou non retourné (0). Donc, je demandais une requête pour trouver tous les membres qui n'ont pas de livres prêtés. –

Répondre

2

Quelque chose comme ça?

SELECT 
    * 
FROM table t 
LEFT JOIN (
    SELECT 
    MIN(Stat) AS Stat, 
    ID 
    FROM table 
    GROUP BY ID 
) minstat ON t.ID = minstat.ID 
WHERE minstat.Stat = 1; 

Fondamentalement, la sous-requête calcule la stat minimum par ID, alors que la requête externe sélectionne uniquement les lignes avec la stat minimum égal à 1. Si toutes les lignes doivent satisfaire une certaine condition, insérez une expression booléenne au lieu de Stat au minimum.

Vous ne savez pas si cela est possible sans sous-requête.

+0

Merci l'homme, essayé de comprendre celui-ci pendant des heures :) –

+0

Bienvenue. Encore curieux, peut-être que vous pouvez améliorer le schéma de base de données pour éviter ce genre de requêtes étranges – Martijn

0

Cela fonctionne aussi,

SELECT * FROM tablename t1 
WHERE (
     SELECT COUNT(*) FROM tablename t2 
     WHERE t1.ID = t2.ID AND t2.STAT = 0 
    ) = 0 

cette requête vérifie, est là STAT avec la valeur 0 dans les dossiers avec la même ID.

+0

Oui, celui-ci fonctionne aussi, seulement, quand vous avez beaucoup d'enregistrements, la solution de Martijn semble être beaucoup plus rapide. Merci quand même. –

0

Que diriez-vous ceci:

select * from t where not (id in (select id from t where stat=0));
+0

Ales déclare que ma solution est la plus lente. Mais à mon avis c'est le plus rapide en compréhension humaine et en temps de reproduction. Et depuis qu'Alès «essayait de comprendre cela pendant des heures ...», cela pourrait bien être un facteur critique. –

0

Tous les 3 solutions suggérées ci-dessus travail bien, la différence est que dans la vitesse d'exécution. Sur une table où 3 enregistrements se trouvent parmi environ 7000 résultats sont les suivants:

Martijn de: lignes Affichage à 0 - 2 (3 au total, la requête a 0,0069 s)

Alex: lignes affichage 0 - 2 (3 au total, Query se 0,1162 sec)

de Pavelasc: Affichage des lignes 0-2 (3 au total, Query a 0,6160 sec)

Questions connexes