2009-07-28 8 views
6

Actualizando por solicitud de @Cesar. Espero haber entendido lo que quieres, si no, por favor invierte. Quassnoi.Evaluación de múltiples expresiones 'IN' en cláusulas 'WHERE' en mysql

si hago una consulta SQL así: SELECT * FROM TABLE_NAME WHERE b IN (2, 7) AND c IN (3, 9), puedo suponer que MySQL sólo coincidirá con pares de elementos con mismo número en cada lista?

Es decir, (2, 3), (7, 9), ...?

Por ejemplo, supongamos que tenemos una tabla como la siguiente:

 
+----------+----------+----------+ 
| PK |  b |  c | 
+----------+----------+----------+ 
|  1 |  2 |  3 | 
+----------+----------+----------+ 
|  2 |  5 |  4 | 
+----------+----------+----------+ 
|  3 |  7 |  9 | 
+----------+----------+----------+ 
|  4 |  7 |  4 | 
+----------+----------+----------+ 
|  5 |  2 |  9 | 
+----------+----------+----------+ 

¿Es correcto asumir que los única filas devueltas son 1 y 3 (y no 5)?

+0

será mejor que cambie "c IN (4,4)" en su ejemplo para aclaración. – palindrom

+0

@Quassnoi: Sí, me entendiste perfectamente, ¡Gracias! – Cesar

Respuesta

14
SELECT * FROM TABLE_NAME WHERE b IN(5,7) AND c IN(4,4) 

Esta consulta devolverá filas, donde b es o bien 5 o 7, Y c es 4.

¿Qué quiere decir con "evaluación en parejas?"

Actualización:

Voy a añadir una fila más a la muestra:

+----------+----------+----------+ 
| PK |  b |  c | 
+----------+----------+----------+ 
|  1 |  2 |  3 | 
+----------+----------+----------+ 
|  2 |  5 |  4 | 
+----------+----------+----------+ 
|  3 |  7 |  9 | 
+----------+----------+----------+ 
|  4 |  7 |  4 | 
+----------+----------+----------+ 
|  5 |  2 |  9 | 
+----------+----------+----------+ 

Si desea hacer coincidir los conjuntos completos, puede utilizar esta sintaxis:

SELECT * 
FROM table_name 
WHERE (b, c) IN ((2, 3), (7, 9)) 

Esto significa: "devolver todas las filas donde b es 2 y c es 3 al mismo tiempo, O b es 7 y с es 9 al mismo tiempo."

En el ejemplo anterior, esta consulta devolverá filas 1 y 3

Pero si reescribir esta consulta a la inversa alrededor, así:

SELECT * 
FROM table_name 
WHERE b IN (2, 7) 
     AND c IN (3, 9) 

, esto significa "devolver todas las filas en las que es o bien b2 o 7, Y c está bien 3 o 9).

Esto devolverá filas 1, 3 y 5, puesto fila 5 satisface la condición para la segunda consulta, pero no para el primero.

+0

Sí, eso es lo que estoy tratando de hacer (todo el conjunto de cosas), solo que no soy un hablante de inglés y supongo que no me hice claro Si alguien pudiera editar la pregunta para reflejar lo que hice Estoy buscando, por favor siéntete libre de hacerlo. – Cesar

+0

(b, c) IN ((2, 3), (7, 9)) no funciona en mariadb – DevWL

+0

@DevWL: sí lo hace – Quassnoi

5

El retorno de las filas 2 & 4 es correcto, aunque su elección de (4,4) puede hacerlo un poco más confuso, ya que es redundante. La AND significa que la fila debe satisfacer ambas condiciones para que sea verdadera. Si la consulta tuviera WHERE b IN(5,7) AND c IN(4,9), obtendría las filas 2, 3 y 4 devueltas.

Si lo piensas en pares, debes tener todas las combinaciones. por ejemplo, b IN(5,7) AND c IN(4,9) produciría (5,4), (5,9), (7,4) y (7,9) combinaciones posibles que funcionarían, y NO solo (5,4) y (7,9)

0

Sí, creo que tiene razón.

Efectivamente, 'IN' puede considerarse una abreviatura de (b = 5 OR b = 7). NO es así como funciona 'debajo del capó', pero es una manera fácil de pensarlo.

Para tablas grandes, múltiples cláusulas 'IN' causarán problemas de rendimiento.

EDIT:

El cartel anterior es correcta, c IN (4, 4) es inútil. Podrías decir fácilmente 'Y c = 4'.

Si convierte las cláusulas a sus equivalentes lógicas, ver por qué:

SELECT * FROM tabla DONDE (b = 5 O b = 7) y (c = 4 o C = 4)

+2

Tiene razón en que su consulta devolverá las filas 2 y 4, pero no por la razón que él piensa. – Rafe

+0

Ah, acabo de entender lo que quería decir con "evaluación por parejas" y aclaré mi respuesta. – Jeff

4

Puede evaluar cada condición en orden, podría darle una mejor idea de lo que está sucediendo aquí. Su consulta establece que todos los valores deben ser seleccionados donde b es 5 o 7 y c es 4, así que vamos a reducir la tabla usando primera condición (b IN (5,7)):

+----------+----------+----------+ 
| PK |  b |  c | 
+----------+----------+----------+ 
|  1 |  2 |  3 | < No match 
+----------+----------+----------+ 
|  2 |  5 |  4 | < Match 
+----------+----------+----------+ 
|  3 |  7 |  9 | < Match 
+----------+----------+----------+ 
|  4 |  7 |  4 | < Match 
+----------+----------+----------+ 

Ahora, vamos a evaluar la siguiente condición, ambos deben es verdad con el fin de una fila para ser seleccionado (c IN (4,4), HICH es esencialmente el mismo que c = 4):

+----------+----------+----------+ 
| PK |  b |  c | 
+----------+----------+----------+ 
|  2 |  5 |  4 | < Match 
+----------+----------+----------+ 
|  3 |  7 |  9 | < No match 
+----------+----------+----------+ 
|  4 |  7 |  4 | < Match 
+----------+----------+----------+ 

Todo lo demás es válido:

+----------+----------+----------+ 
| PK |  b |  c | 
+----------+----------+----------+ 
|  2 |  5 |  4 | 
+----------+----------+----------+ 
|  4 |  7 |  4 | 
+----------+----------+----------+ 
1

Su ejemplo no ilustra exactamente su pregunta, pero múltiples cláusulas IN no están relacionadas entre sí; se evalúan en secuencia como cualquier otra cláusula WHERE.

Por lo tanto, la siguiente consulta

SELECT * FROM FOO WHERE b IN(5,7) AND c IN(4,8) 

coincidirá con cualquier de los siguientes:

b c 
---- 
5 4 
5 8 
7 4 
7 8

IN puede considerarse taquigrafía para las comparaciones o separados.Esto significa que la consulta anterior también se puede escribir como (la mecánica es un poco diferente, pero el concepto es el mismo):

SELECT * FROM FOO WHERE (b = 5 OR b = 7) AND (c = 4 OR c = 8) 

Así, en su ejemplo, sí, las únicas filas devueltas son 2 y 4. Pero no es exactamente por la razón que usted supone.

Cuestiones relacionadas