Область столбца с присоединенными подзапросами - PullRequest
0 голосов
/ 22 января 2012

Я должен выбрать подсчитанный столбец, сгруппированный по датам из двух источников.Я присоединяюсь к результирующему как подзапрос.Тем не менее, результат является поддельным.Как я вижу, проблема связана с предложением JOIN .. ON.Этот запрос работает нормально:

SELECT id
FROM pu a 
LEFT JOIN (
    SELECT 
        COUNT(pd.id) AS c_id1, 
        NULL AS c_id2,
        LEFT(pd.start_date, 10) AS date,
        pd.pid 
    FROM 
        p_d pd
    **WHERE pd.pid = 111**
    GROUP BY date

    UNION 

    SELECT 
        NULL AS c_id1,
        COUNT(pd.id) AS c_id2,
        LEFT(pd.inactivation_date, 10) AS date, 
        pd.pid
    FROM 
        p_d pd
    **WHERE pd.pid = 111**
    GROUP BY date
) x
ON x.pid = a.id;

Но этот (без предложения WHERE) возвращает неверный набор результатов:

SELECT id
FROM pu a 
LEFT JOIN (
    SELECT 
        COUNT(pd.id) AS c_id1, 
        NULL AS c_id2,
        LEFT(pd.start_date, 10) AS date,
        pd.pid 
    FROM 
        p_d pd
    GROUP BY date

    UNION 

    SELECT 
        NULL AS c_id1,
        COUNT(pd.id) AS c_id2,
        LEFT(pd.inactivation_date, 10) AS date, 
        pd.pid
    FROM 
        p_d pd
    GROUP BY date
) x
ON x.pid = a.id;

Возможно использовать a.id вприсоединился к подзапросу как-нибудь?Теперь это «неизвестный столбец».

1 Ответ

3 голосов
/ 22 января 2012

В вашем подзапросе вы используете столбцы типа pd.pid для SELECT, которые не являются частью GROUP BY и не агрегированы. Такие столбцы называются hidden, и в стандартном SQL это приведет к синтаксической ошибке, но mysql разрешает ее, хотя она может свободно выбирать значение из любой строки в каждой группе.

Если вы ограничите свой набор с помощью WHERE pd.pid = 111, все значения pd.pid в группе будут одинаковыми, поэтому не имеет значения, какая строка будет использоваться для его получения, однако без значения WHERE pd. pid будет не определен (mysql, вероятно, выберет тот, который поможет вам быстрее всего). Вы также используете этот неопределенный pid для JOIN, так что вы обязательно получите неправильные результаты.

http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html

Трудно сказать, однако, как вам следует переписать ваш запрос, поскольку вы не предоставляете достаточно информации о схеме таблицы, чего вы пытаетесь достичь и в чем смысл имен таблиц / столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...