Valutazione dei multipli 'IN' Espressioni 'DOVE' le clausole di mysql
-
19-09-2019 - |
Domanda
Aggiornamento da @Cesar
's richiesta.La speranza che ho capito quello che volete, se non, si prega di tornare.Quassnoi.
Se faccio un SQL
query come questa: SELECT * FROM TABLE_NAME WHERE b IN (2, 7) AND c IN (3, 9)
, posso supporre che MySQL
corrisponde solo coppie di elementi con lo stesso numero, in ogni lista?
Che è, (2, 3)
, (7, 9)
, ...?
Per esempio, supponiamo di avere una tabella come questa:
+----------+----------+----------+ | PK | b | c | +----------+----------+----------+ | 1 | 2 | 3 | +----------+----------+----------+ | 2 | 5 | 4 | +----------+----------+----------+ | 3 | 7 | 9 | +----------+----------+----------+ | 4 | 7 | 4 | +----------+----------+----------+ | 5 | 2 | 9 | +----------+----------+----------+
È corretto ritenere che il solo righe restituite sono 1
e 3
(e non 5
)?
Soluzione
SELECT * FROM TABLE_NAME WHERE b IN(5,7) AND c IN(4,4)
Questa query restituirà righe, dove b
è 5
o 7
, E c
è 4
.
Che cosa si intende per "valutazione in coppia?"
Aggiornamento:
Vorrei aggiungere una riga più al campione:
+----------+----------+----------+
| PK | b | c |
+----------+----------+----------+
| 1 | 2 | 3 |
+----------+----------+----------+
| 2 | 5 | 4 |
+----------+----------+----------+
| 3 | 7 | 9 |
+----------+----------+----------+
| 4 | 7 | 4 |
+----------+----------+----------+
| 5 | 2 | 9 |
+----------+----------+----------+
Se si desidera far corrispondere l'intero set, è possibile utilizzare questa sintassi:
SELECT *
FROM table_name
WHERE (b, c) IN ((2, 3), (7, 9))
Questo significa che:"restituire tutte le righe in cui b
è 2
e c
è 3
allo stesso tempo, O b
è 7
e с
è 9
allo stesso tempo".
Nell'esempio di cui sopra, la query restituirà righe 1
e 3
Ma se la riscrittura di questa query in un altro modo, come questo:
SELECT *
FROM table_name
WHERE b IN (2, 7)
AND c IN (3, 9)
, questo significa "restituire tutte le righe in cui b
è 2
o 7
, E c
è 3
o 9
).
Questo restituirà righe 1
, 3
e 5
, poiché riga 5
soddisfa la condizione per la seconda query, ma non per il primo.
Altri suggerimenti
Il ritorno di righe 2 e 4 è corretto, se la vostra scelta di (4,4) in grado di rendere un po ' più di confusione, come è ridondante.La E significa che la riga deve soddisfare sia le condizioni per essere vero.Se la query ha avuto WHERE b IN(5,7) AND c IN(4,9)
, si dovrebbe ottenere le righe 2, 3 e 4 restituito.
Se si pensa a coppie, è necessario disporre di tutte le combinazioni.ad esempio, b IN(5,7) AND c IN(4,9)
sarebbe resa (5,4), (5,9), (7,4), e (7,9) come possibili combinazioni che avrebbe funzionato, e NON solo (5,4) e (7,9)
È possibile valutare ogni condizione, potrebbe dare una migliore idea di ciò che sta accadendo qui.La query afferma che tutti i valori devono essere selezionati dove b è 5 o 7 e c è 4, quindi cerchiamo di ridurre la tabella utilizzando prima condizione (b IN (5,7)
):
+----------+----------+----------+
| PK | b | c |
+----------+----------+----------+
| 1 | 2 | 3 | < No match
+----------+----------+----------+
| 2 | 5 | 4 | < Match
+----------+----------+----------+
| 3 | 7 | 9 | < Match
+----------+----------+----------+
| 4 | 7 | 4 | < Match
+----------+----------+----------+
Ora, cerchiamo di valutare il prossimo condizione deve essere vero, in modo che una riga selezionata (c IN (4,4)
, hich è essenzialmente lo stesso come c = 4
):
+----------+----------+----------+
| PK | b | c |
+----------+----------+----------+
| 2 | 5 | 4 | < Match
+----------+----------+----------+
| 3 | 7 | 9 | < No match
+----------+----------+----------+
| 4 | 7 | 4 | < Match
+----------+----------+----------+
Tutto il resto è valido:
+----------+----------+----------+
| PK | b | c |
+----------+----------+----------+
| 2 | 5 | 4 |
+----------+----------+----------+
| 4 | 7 | 4 |
+----------+----------+----------+
Sì, credo che si siano corrette.
Effettivamente, 'IN' può essere considerata una scorciatoia per (b = 5 O b = 7).Questo NON è come funziona 'sotto il cofano', ma è un modo facile pensare.
Per tabelle di grandi dimensioni, più 'IN' clausole causa problemi di prestazioni.
EDIT:
Il poster di cui sopra è corretta, c (4, 4) è inutile.Si potrebbe facilmente dire 'E c = 4'.
Se si decide di convertire le clausole alle loro logiche equivalenti, si capisce il perché:
SELECT * FROM tabella DOVE b = 5 O b = 7) E c = 4 c = 4)
Il tuo esempio non è esattamente illustrare la tua domanda, ma più clausole non sono correlati l'uno all'altro;essi sono valutati in sequenza, come qualsiasi altra clausola WHERE.
Così, la query seguente
SELECT * FROM FOO WHERE b IN(5,7) AND c IN(4,8)
corrisponde a una delle seguenti operazioni:
b c ---- 5 4 5 8 7 4 7 8
IN
può essere considerata una scorciatoia per o separati confronti.Questo significa che la query precedente può essere scritta come (il meccanismo è leggermente diverso, ma il concetto è lo stesso):
SELECT * FROM FOO WHERE (b = 5 OR b = 7) AND (c = 4 OR c = 8)
Quindi, nel tuo esempio, sì, solo le righe restituite, 2 e 4.Ma non è proprio per il motivo che pensate.