Precedencia de operadores es lo que tiene de diferente ;), sql server analiza las sentencias de izquierda a derecha por lo que esto:
Código SQL:
Ver originalSELECT * FROM `ZZZZZZZZZZ` WHERE `CODIGO` = '$q' AND `estado` = 'PRESENTADO' OR `estado` = 'OBSERVADO'
nos va da dar como resultado todos los valores donde el codigo sea por ejemplo 1 y el estado sea presentado....hasta ahi todo bien, pero viene una sentencia OR, por lo que buscara todos los valores que tenga estado observado
si tenemos estos datos
codigo estado
1 presentado
1 presentado
2 observado
3 observado
Nos va a regresar todos los registros, porque porque se cumple que codigo sea 1 O estado sea observado :).
usando el mismo ejemplo pero usando el query que propongo:
Código SQL:
Ver originalSELECT * FROM `ZZZZZZZZZZ` WHERE (`CODIGO` = '$q') AND (`estado` = 'PRESENTADO' OR `estado` = 'OBSERVADO')
Aqui sql analizaria que tenga el codigo=1 y que el estado sea presentado u observado
con los datos de ejemplo nada mas nos regresara donde codigo=1 y estado presentado u observado en este caso nada mas los primeros 2 registros
1 presentado
1 presentado
Recuerda que una operacion logica cuando usas un and ambos resultados se deben de cumplir, en cambio cuando usas OR cualquiera de los 2 cumplan la condicion es mas que suficiente
Tabla de Verdad and:
1 and 1 =1
1 and 0 =0
0 and 1 = 0
0 and 0 =0
Tabla de verdad OR:
1 or 1 =1
1 or 0 =1
0 or 1 = 1
0 or 0 = 0
Se entiende?