2010-03-12 16 views
5

estoy teniendo esta consulta MySQL, Funciona:MySql problema de alcance con subconsultas correlacionadas

SELECT 
    nom 
    ,prenom 
    ,(SELECT GROUP_CONCAT(category_en) FROM 
      (SELECT DISTINCT category_en FROM categories c WHERE id IN 
       (SELECT DISTINCT category_id FROM m3allems_to_categories m2c WHERE m3allem_id = 37) 
      ) cS 
    ) categories 
    ,(SELECT GROUP_CONCAT(area_en) FROM 
      (SELECT DISTINCT area_en FROM areas c WHERE id IN 
       (SELECT DISTINCT area_id FROM m3allems_to_areas m2a WHERE m3allem_id = 37) 
      ) aSq 
    ) areas 
FROM m3allems m 
WHERE m.id = 37  

El resultado es:

nom    prenom  categories    areas 
Man    Multi  Carpentry,Paint,Walls Beirut,Baalbak,Saida 

Funciona correclty, pero sólo cuando i codificar en la consulta la identificación que quiero (37). quiero que funcione para todas las entradas en la tabla m3allem, así que intente esto:

SELECT 
    nom 
    ,prenom 
    ,(SELECT GROUP_CONCAT(category_en) FROM 
      (SELECT DISTINCT category_en FROM categories c WHERE id IN 
       (SELECT DISTINCT category_id FROM m3allems_to_categories m2c WHERE m3allem_id = m.id) 
      ) cS 
    ) categories 
    ,(SELECT GROUP_CONCAT(area_en) FROM 
      (SELECT DISTINCT area_en FROM areas c WHERE id IN 
       (SELECT DISTINCT area_id FROM m3allems_to_areas m2a WHERE m3allem_id = m.id) 
      ) aSq 
    ) areas 
FROM m3allems m 

y me sale un error:

Unknown column 'm.id' in 'where clause'

¿Por qué? Desde el manual de MySQL:

13.2.8.7. Correlated Subqueries 
[...] 
Scoping rule: MySQL evaluates from inside to outside. 

Así que ... hacer esto no funciona cuando la subconsulta está en una sección SELECT? No leí nada sobre eso.

¿Alguien sabe? ¿Que debería hacer? Me llevó mucho tiempo crear esta consulta ... Sé que es una consulta monstruosa, pero obtiene lo que quiero en una sola consulta, ¡y estoy muy cerca de hacer que funcione!

¿Alguien puede ayudar?

Respuesta

6

Solo se puede establecer una correlación de un nivel de profundidad.

Uso:

SELECT m.nom, 
      m.prenom, 
      x.categories, 
      y.areas 
    FROM m3allens m 
LEFT JOIN (SELECT m2c.m3allem_id, 
        GROUP_CONCAT(DISTINCT c.category_en) AS categories 
      FROM CATEGORIES c 
      JOIN m3allems_to_categories m2c ON m2c.category_id = c.id 
     GROUP BY m2c.m3allem_id) x ON x.m3allem_id = m.id 
LEFT JOIN (SELECT m2a.m3allem_id, 
        GROUP_CONCAT(DISTINCT a.area_en) AS areas 
      FROM AREAS a 
      JOIN m3allems_to_areas m2a ON m2a.area_id = a.id 
     GROUP BY m2a.m3allem_id) y ON y.m3allem_id = m.id 
    WHERE m.id = ? 
+0

¡Funciona! ¡Muchas gracias! No sabía que solo puedes correlacionar un nivel profundo. – Rolf

1

El motivo del error es que en la sub consulta m no está definido. Se define más adelante en la consulta externa.

Cuestiones relacionadas