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

Devuelve 4 valores como los que estoy pidiendo, pero la siguiente declaración arroja 0: ¿existe una regla sobre el uso de la instrucción O con la que no estoy familiarizado? Mi suposición es que debería devolver todos los valores en 1 (o más si no fuera por el límite).SQL LIMIT no devuelve ningún resultado donde no LIMIT devuelve resultados

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 por cyberkiwi la primera o la porción de Q2 es exactamente la misma que la cláusula WHERE en Q1

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

Sin la O declaración por sí mismo no producir el resultado deseado, siempre ya que no tiene el límite. Cuando la instrucción OR también se utiliza con el LÍMITE, se devuelven 0 valores.

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

^- Eso produce 0 resultados

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

^- que produce resultados

Lo más extraño de esto es que todas estas preguntas sobre el producto el efecto deseado en mi PHPMYADMIN Ventana de consulta SQL, pero no en la aplicación en sí.

+0

Parece ser un error lógico booleano en lugar de específico para OR. Envuelve todo alrededor de las llaves, esa es toda tu condición alrededor (y). – JonH

+0

No, devuelve los valores –

+1

Esto es muy interesante. ¿Alguien puede explicar por qué está mal en lugar de dar un enfoque alternativo? +1 – Nishant

Respuesta

1

Usted está repitiendo algunas de las condiciones que no es necesario. Tal vez puedas probar:

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

ACTUALIZACIÓN:

He creado la siguiente tabla:

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

y 5 veces:

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

Y finalmente la consulta:

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) 

Así que siento decir que no puedo volver a crear el problema.

+2

Si bien eso es cierto, ¿explica por qué la consulta no lo hace? t trabajo? – RichardTheKiwi

+0

@cyberwiki: veamos tu respuesta, sabelotodo: p – VoodooChild

+0

¿te preguntas qué pasa con la consulta OP? – Nishant

1

tratar de poner() cerca de toda la condición

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

así:

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, no cambia el conjunto de resultados de 0 –

+0

¿Necesitaría estos corchetes si no tuviera la instrucción 'LIMIT 4'? – VoodooChild

+0

@Bob Cavezza - Elimina piezas pequeñas para ver el problema. Por ejemplo, deshazte de los 2 AND de la parte OR y tenlo igual o description_Producto LIKE '% football%' ... Luego mira si vuelven las filas. Haría uso de (y) un poco más. Estas AND y OR podrían arruinar esto para ti ... – JonH

1

I que que podría limpiarlo un poco, que está recibiendo sólo las filas de una escuela, y una categoría de identificación, así que no hay razón por la que usted debe tener para comprobar si los dos tiempos:

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, golpeado por Klaus. Necesita ser más rápido la próxima vez. : P – bhamby

+0

LOL @galador, usted tiene todo el tiempo del mundo para explicar WTH pasando aquí (ver los comentarios en OP). Voy a votar por clavarlo. – Nishant

Cuestiones relacionadas