2015-03-23 18 views
9

Ho un piccolo tavolo mysql (MySQL versione 5.6.23):MySQL fila questione confronto sottoquery

+-----------+-----------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-----------+-----------------+------+-----+---------+----------------+ 
| id  | int(6) unsigned | NO | PRI | NULL | auto_increment | 
| dividends | float(8,6)  | YES |  | NULL |    | 
+-----------+-----------------+------+-----+---------+----------------+ 

mio clausola dove segue la sintassi row-subqueries.
Se faccio:

SELECT id, dividends FROM test 
    where (id,dividends) >= (660,0.5); 

o

SELECT id, dividends FROM test 
    where (id,dividends) >= (660,CAST(0.5 AS DECIMAL(8,6))); 

ottengo questo risultato:

+-----+-----------+ 
| id | dividends | 
+-----+-----------+ 
| 660 | 0.500000 | 
| 661 | 0.470000 | 
| 662 | 0.470000 | 
| 663 | 0.470000 | 
| 664 | 2.580000 | 
| 665 | 2.581000 | 
... 

Mi sembra che i dividendi> = 0.5 non viene presa in considerazione. Perché?

risposta

7

Sei usando i costruttori di riga. MySQL li tratta esattamente come le righe di un tavolo. Così WHERE (id,dividends) >= (660,0.5) fa effettivamente la stessa:

  1. ORDER BY id,dividends;

  2. Trovare il punto in cui (660,0.5) si siederebbe all'interno di tale ordinamento;

  3. Filtro solo per i record che sono uguali o maggiori di quel punto nell'ordinazione.

Di conseguenza, è lo stesso di WHERE (id=660 AND dividends>=0.5) OR id>660.

Sembra che la logica che si desidera veramente esprimere sia WHERE id>=660 AND dividends>=0.5.

+0

In modo che significhi che la mia query restituirà tutte le righe (senza filtro) che si trovano dopo il punto trovato in 2.? – Bruckwald

+0

@Bruckwald: Sì (compreso quel punto stesso). – eggyal

+0

Strano. Questo non è quello che mi aspettavo dopo aver letto i documenti mysql. Ma molte grazie per la spiegazione! – Bruckwald

0

Split le condizioni in cui per farlo funzionare

SELECT id, dividends 
FROM test 
WHERE id >= 660 
AND dividends >= 0.5; 

Quando multi-colum IN viene utilizzato e l'indice è definito solo sulla prima colonna Non viene utilizzato:

problema simile è stato discusso qui e può essere utile http://www.percona.com/blog/2008/04/04/multi-column-in-clause-unexpected-mysql-issue/

Con il bug rintracciato qui http://bugs.mysql.com/bug.php?id=35819

+4

Questo non spiega perché la query originale non riesce –

+0

Grazie, ma mi chiedo perché l'esempio sopra non funziona.Se uso '=' invece di '> =' Ottengo un risultato corretto – Bruckwald

+0

Penso che l'OP sappia se dividi la condizione in cui clausola funzionerà, ma la domanda è un'altra cosa – jfun

2

Guardando il tuo dove cla usa tutto ciò che riguarda l'ID prima valuta true e poi tutto il resto viene valutato ma non deve essere in conflitto con i primi risultati id. È anche possibile che tu non abbia alcun ID maggiore di 660 che ha un dividendo maggiore di 0,5.

(id,dividends) >= (660,CAST(0.5 AS DECIMAL(8,6))); 

query SQL sarà sempre iniziare a valutare id prima per tutti i campi> = 660 ... quindi valutare dividendi ... si può provare a eseguire la query sottostante e verifica i risultati

where ((id) >= (660)) AND ((dividends) >= (0.5)); 
+0

I ottenere risultati validi se espongo la clausola where – Bruckwald