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)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top