Проблема определения объема MySql с коррелированными подзапросами - PullRequest
5 голосов
/ 12 марта 2010

У меня есть этот запрос Mysql, он работает:

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     

Результат:

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

Это работает корректно, но только когда я жестко ввожу в запрос идентификатор, который мне нужен (37). Я хочу, чтобы он работал для всех записей в таблице m3allem, поэтому я пытаюсь это:

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

И я получаю ошибку:

Неизвестный столбец 'm.id' в 'где пункт '

Почему? Из руководства MySql:

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

Итак ... это не работает, когда подзапрос находится в разделе SELECT? Я ничего не читал об этом.

Кто-нибудь знает? Что я должен делать? Создание этого запроса заняло у меня много времени ... Я знаю, что это запрос монстра, но он получает то, что я хочу, в одном запросе, и я так близок к тому, чтобы заставить его работать!

Может кто-нибудь помочь?

Ответы [ 2 ]

6 голосов
/ 12 марта 2010

Вы можете соотнести только один уровень глубины.

Использование:

   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 = ?
1 голос
/ 12 марта 2010

Причина ошибки заключается в том, что в подзапросе m не определено. Это определено позже во внешнем запросе.

...