MySql, определяющий объем проблемы со связанными подзапросами

Я сделал, чтобы этот 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

Это работает correclty, но только когда я hardcode в запрос идентификатор, который я хочу (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? Я ничего не считал об этом.

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

Кто-либо может помочь?

7
задан Rolf 12 March 2010 в 20:26
поделиться

2 ответа

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

Используйте:

   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 = ?
8
ответ дан 7 December 2019 в 03:14
поделиться

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

1
ответ дан 7 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: