2010-02-13 4 views
0

J'ai un problème avec la requête MySQL suivante:problème de requêtes MySQL avec Bool

SELECT * FROM TPDSessions WHERE TPDS_Morning = 0 AND TPDD_Id = 1 AND TPDS_Chair1_idPerson = 16785 OR TPDS_Chair2_idPerson = 16785 

La ligne retournée a TPDS_Morning d'une valeur de 1, et je ne comprends pas pourquoi. Ceci est la structure de la table:

CREATE TABLE `TPDSessions` (
    `TPDS_Id` int(11) NOT NULL auto_increment, 
`TPDR_Id` int(32) NOT NULL, 
`TPDD_Id` int(32) NOT NULL, 
`TPDS_Morning` tinyint(1) NOT NULL, 
`TPDS_Name` varchar(200) NOT NULL, 
`TPDS_Chair1_idPerson` int(11) NOT NULL, 
`TPDS_Chair2_idPerson` int(11) NOT NULL, 
PRIMARY KEY (`TPDS_Id`), 
KEY `chair1_idPerson` (`TPDS_Chair1_idPerson`,`TPDS_Chair2_idPerson`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 

Si quelqu'un peut expliquer comment ajuster ma requête pour ne pas retourner ce résultat ...

+0

Le mot magique est «précédence». http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html – bobince

Répondre

2

peut-être manquant quelques parenthèses avec la OU déclaration.

Il pourrait être soit

SELECT * 
FROM TPDSessions 
WHERE (TPDS_Morning = 0 
AND  TPDD_Id = 1 
AND  TPDS_Chair1_idPerson = 16785) 
OR  TPDS_Chair2_idPerson = 16785 

SELECT * 
FROM TPDSessions 
WHERE TPDS_Morning = 0 
AND  TPDD_Id = 1 
AND  (TPDS_Chair1_idPerson = 16785 
OR  TPDS_Chair2_idPerson = 16785) 

Je pense que la seconde est plus probablement ce que vous recherchez.

+1

Oui, étant donné la question la deuxième est très probable –

+0

argh..yes c'est tout. Merci d'avoir éclairci cela, avait ce problème avant, mais pas assez souvent apparemment pour le remarquer cette fois. Merci! – Maarten

1

Parce que vous avez un OR à la fin. Il peut y avoir une ligne avec Chair2_idPerson = 16875 et avec TDPS_Morning = 1. Placez des crochets, le cas échéant, pour regrouper les instructions.