2011-01-25 14 views
11
SELECT * FROM mm_tfs 
WHERE product_slug LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21' 
LIMIT 4 

Restituisce 4 valori come sto chiedendo, ma la seguente dichiarazione restituisce 0 - esiste una regola sull'utilizzo dell'istruzione OR che non mi è familiare? La mia ipotesi è che dovrebbe restituire tutti i valori in 1 (o più se non fosse per il limite).SQL LIMIT non restituisce risultati dove nessun LIMIT restituisce risultati

SELECT * FROM mm_tfs 
WHERE (product_slug LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21') 
OR (product_description LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21') 
LIMIT 4 

NOTA dalla cyberkiwi primo o porzione di Q2 è esattamente la stessa della clausola WHERE Q1

product_description LIKE '%football%' AND schoolid = '8' AND category_id ='21 

Senza OR Dichiarazione di per sé non produrre il risultato desiderato purché in quanto non ha il limite. Quando l'istruzione OR viene utilizzata anche con LIMIT, ci sono 0 valori restituiti.

SELECT * FROM mm_tfs 
WHERE product_description LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21' 
LIMIT 4 

^- Che produce 0 risultati

SELECT * FROM mm_tfs 
WHERE product_description LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21' 

^- che produce risultati

La parte più strana di questo è che tutte queste query prodotto l'effetto proprio nel mio PHPMYADMIN Finestra di query SQL, ma non nell'applicazione stessa.

+0

Sembra essere un errore logico booleano piuttosto che specifico per OR. Avvolgere l'intera cosa intorno alle parentesi graffe, questa è l'intera condizione intorno (e). – JonH

+0

No, restituisce i valori –

+1

Ciò è molto interessante. Qualcuno può spiegare perché è sbagliato invece di dare un approccio alternativo? +1 – Nishant

risposta

1

state ripetendo alcune delle condizioni che non è necessario. Prova a modificare:

SELECT * FROM mm_tfs 
WHERE 
    (product_slug LIKE '%football%' 
OR product_description LIKE '%football%') 
    AND schoolid = '8' 
    AND category_id ='21' 
LIMIT 4 

UPDATE:

ho creato la seguente tabella:

create table mm_tfs2 (schoolid varchar(2), categoryid varchar(2), 
         description varchar(20), slug varchar(20)); 

e 5 volte:

insert into mm_tfs2 values (8, 21, '', 'football'); 

E infine la query:

select * from mm_tfs2 where 
(slug like '%football%' and schoolid = 8 and categoryid = 21) 
or (description like '%football%' and schoolid = 8 and categoryid = 21) 
limit 4; 
+----------+------------+-------------+----------+ 
| schoolid | categoryid | description | slug  | 
+----------+------------+-------------+----------+ 
| 8  | 21   |    | football | 
| 8  | 21   |    | football | 
| 8  | 21   |    | football | 
| 8  | 21   |    | football | 
+----------+------------+-------------+----------+ 
4 rows in set (0.00 sec) 

Quindi mi dispiace dire che non sono in grado di ricreare il problema.

+2

Mentre ciò è vero, spiega perché la query non lo fa lavoro? – RichardTheKiwi

+0

@cyberwiki: vediamo la tua risposta, smarty pants: p – VoodooChild

+0

chiedo cosa c'è di sbagliato nella query OP? – Nishant

1

tenta di mettere() arround l'intera condizione

((...AND...) OR (...AND...)) 

Come così:

SELECT * FROM mm_tfs WHERE 
    ( (product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='21') 
    OR (product_description LIKE '%football%' AND schoolid = '8' AND category_id 
    ='21') 
) LIMIT 4 
+0

No, non cambia il set di risultati da 0 –

+0

Avrebbe bisogno di queste parentesi se non avesse l'istruzione "LIMIT 4"? – VoodooChild

+0

@Bob Cavezza - Elimina i pezzi piccoli per vedere il problema. Ad esempio, sbarazzati dei 2 AND dalla porzione OR e disponili solo o product_description LIKE '% football%' ... Poi vedi se qualche riga ritorna. Vorrei usare (e) un po 'di più. Questi AND e OR potrebbero rovinare tutto questo per voi ... – JonH

1

ho che si poteva ripulire un po ', che stai ricevendo solo le righe per una scuola, e un ID categoria, quindi non c'è alcun motivo che si dovrebbe avere per verificare la presenza di coloro che entrambe le volte:

SELECT * 
FROM mm_tfs 
WHERE schoolid = '8' 
    AND category_id ='21' 
    AND (product_slug LIKE '%football%' 
     OR product_description LIKE '%football%') 
LIMIT 4; 
+0

Hmm, battuto da Klaus. Devi essere più veloce la prossima volta. : P – bhamby

+0

LOL @galador, hai tutto il tempo del mondo per spiegare il WTH in corso qui (vedi i commenti in OP). Starò il voto per averlo inchiodato. – Nishant

Problemi correlati