Problema con SQL anidado

Tengo un problema con la selección anidada en MySQL.

Este funciona, pero necesito conseguir dos de ellos.

Ejemplo:

SELECT `a`.`title` , `a`.`askprice` , `a`.`picture` 
, `a`.`description` , `a`.`userid` , `a`.`id`
FROM (
`mm_ads_fields_values` AS afv
)
LEFT JOIN `mm_ads` AS a ON `a`.`id` = `afv`.`aid`
WHERE `afv`.`value` = '38'
AND `a`.`category` = '227'
AND `a`.`status` =1
AND a.id
IN (
    SELECT a.id
    FROM mm_ads AS a
    LEFT JOIN mm_ads_fields_values AS afv ON afv.aid = a.id
    WHERE afv.value = '2913'
)
ORDER BY `id` DESC
LIMIT 20 

Este funciona. Pero necesito una declaración SQL como esta:

SELECT `a`.`title` , `a`.`askprice` , `a`.`picture` 
, `a`.`description` , `a`.`userid` , `a`.`id`
FROM (
`mm_ads_fields_values` AS afv
)
LEFT JOIN `mm_ads` AS a ON `a`.`id` = `afv`.`aid`
WHERE `afv`.`value` = '38'
AND `a`.`category` = '227'
AND `a`.`status` =1
AND a.id
IN (
   SELECT a.id
   FROM mm_ads AS a
   LEFT JOIN mm_ads_fields_values AS afv ON afv.aid = a.id
   WHERE afv.value = '2913'
)
AND a.id
IN (
    SELECT a.id
    FROM mm_ads AS a
    LEFT JOIN mm_ads_fields_values AS afv ON afv.aid = a.id
    WHERE afv.value = '51'
)
ORDER BY `id` DESC
LIMIT 20 

Y este, el último, no funcionará. Su carga, carga y nunca pasa nada.

¿Qué estoy haciendo mal?

Saludos, Mario

Perdón por mi mal ingles..

preguntado el 16 de mayo de 11 a las 19:05

¿Podría editar su pregunta original y publicar el EXPLAIN EXTENDED SELECT ... producción. -

¿Podría darnos una oración o dos que expliquen el resultado o el objetivo deseado para sus declaraciones SQL? ¿Qué estás tratando de lograr? -

1 Respuestas

Respuesta simplista: ¿no debería la segunda instrucción IN usar OR en lugar de AND? (editar: y usar la precedencia correcta del operador).

...
AND 
( a.id
  IN (
     SELECT a.id
     FROM mm_ads AS a
     LEFT JOIN mm_ads_fields_values AS afv ON afv.aid = a.id
     WHERE afv.value = '2913'
  )
  OR a.id
  IN (
      SELECT a.id
      FROM mm_ads AS a
      LEFT JOIN mm_ads_fields_values AS afv ON afv.aid = a.id
      WHERE afv.value = '51'
  )
)
...

contestado el 16 de mayo de 11 a las 23:05

Si pruebo su ejemplo, phpmyadmin se carga hasta el infinito ... Necesito esa declaración SQL para los filtros en la página de anuncios. Por ejemplo, estoy viendo autos, tienen filtros: Marca, Modelo, Tipo, ... Si hago clic en BMW y selecciono M3, necesito tener dos selecciones anidadas, ¿verdad? Debe haber Y en lugar de O, ¿verdad? - Puzo

¿Quizás hay otra forma de lidiar con eso? - Puzo

en su primera consulta (la que funciona) cambie WHERE afv.value = '2913' a WHERE afv.value = '2913' OR afv.value = '51' - Shawn Leslie

Este funciona pero no es lo que necesito. Quiero reducir los resultados de la búsqueda. Quiero obtener solo anuncios que tengan las opciones 2913 Y 51, en este caso. - Puzo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.