Попытка отфильтровать результаты запроса с помощью CASE - PullRequest
1 голос
/ 23 октября 2019

У меня 2 таблицы WP, 1-я - таблица стандартных пользователей, 2-я - плагин для дополнительных полей. 2-я таблица построена по типу с полями user_id, field_id и значением

. Я построил следующий запрос для извлечения данных из 2-й таблицы, но не могу понять, как отфильтровать результаты на основе 'Stateполе.

Вставка строки WHERE State = 'SA' просто выдает код ошибки: 1054. Неизвестный столбец 'State' в 'where, предложение' Попытка добавить операторы 'IF' в строку CASE не делает 'не работает ... у кого-нибудь есть идеи?

SELECT
        `wpty_users`.`user_login` AS `user_login`,
        `wpty_users`.`display_name` AS `display_name`,
        MIN(CASE WHEN `wpty_cimy_uef_data`.`FIELD_ID` = 8 THEN `wpty_cimy_uef_data`.`VALUE` ELSE NULL END) AS `Club`,
        MIN(CASE WHEN `wpty_cimy_uef_data`.`FIELD_ID` = 9 THEN `wpty_cimy_uef_data`.`VALUE` ELSE NULL END) AS `State`
 FROM
        `wpty_users`
        LEFT JOIN `wpty_cimy_uef_data` ON `wpty_users`.`ID` = `wpty_cimy_uef_data`.`USER_ID`
    GROUP BY `wpty_cimy_uef_data`.`USER_ID`
    ORDER BY `wpty_users`.`user_login`

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Вы можете использовать having:

SELECT `wpty_users`.`user_login` AS `user_login`,
       `wpty_users`.`display_name` AS `display_name`,
        MIN(CASE WHEN `wpty_cimy_uef_data`.`FIELD_ID` = 8 THEN `wpty_cimy_uef_data`.`VALUE` ELSE NULL END) AS `Club`,
        MIN(CASE WHEN `wpty_cimy_uef_data`.`FIELD_ID` = 9 THEN `wpty_cimy_uef_data`.`VALUE` ELSE NULL END) AS `State`
 FROM `wpty_users` LEFT JOIN
      `wpty_cimy_uef_data`
       ON `wpty_users`.`ID` = `wpty_cimy_uef_data`.`USER_ID`
GROUP BY `wpty_cimy_uef_data`.`USER_ID`
HAVING State = 'SA'
ORDER BY `wpty_users`.`user_login`;

HAVING - правильный способ фильтрации запроса агрегации.

Я бы также порекомендовал упростить запрос:

SELECT u.user_loginl, u.display_name,
       MIN(CASE WHEN ud.FIELD_ID = 8 THEN ud.VALUE END) AS Club,
        MIN(CASE WHEN ud.FIELD_ID = 9 THEN ud.VALUE END) AS State
 FROM wpty_users u JOIN
      wpty_cimy_uef_data  ud
      ON u.ID = ud.USER_ID
GROUP BY u.id
HAVING State = 'SA'
ORDER BY u.user_login;

Примечания:

  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Обратные пометки затрудняют написание и чтение запроса.
  • Вы требуете, чтобы был действительный state, поэтому внутреннее объединение является более подходящим, чем внешнее объединение.
  • Ключ GROUP BY действительно должен быть из таблицы пользователей, поскольку он является уникальнымидентификатор в этой таблице, и вы выбираете другие неагрегированные столбцы из этой таблицы.
0 голосов
/ 23 октября 2019

Вы можете обернуть свой запрос:

SELECT *
FROM (
    SELECT
        `wpty_users`.`user_login` AS `user_login`,
        `wpty_users`.`display_name` AS `display_name`,
        MIN(CASE WHEN `wpty_cimy_uef_data`.`FIELD_ID` = 8 THEN `wpty_cimy_uef_data`.`VALUE` ELSE NULL END) AS `Club`,
        MIN(CASE WHEN `wpty_cimy_uef_data`.`FIELD_ID` = 9 THEN `wpty_cimy_uef_data`.`VALUE` ELSE NULL END) AS `State`
     FROM
        `wpty_users`
        LEFT JOIN `wpty_cimy_uef_data` ON `wpty_users`.`ID` = `wpty_cimy_uef_data`.`USER_ID`
    GROUP BY `wpty_cimy_uef_data`.`USER_ID`
    ORDER BY `wpty_users`.`user_login`
) x
WHERE `State` = 'SA'

Или, что еще лучше, вы можете использовать псевдоним столбца в предложении HAVING (насколько это поддерживается в MySQL):

SELECT
    `wpty_users`.`user_login` AS `user_login`,
    `wpty_users`.`display_name` AS `display_name`,
    MIN(CASE WHEN `wpty_cimy_uef_data`.`FIELD_ID` = 8 THEN `wpty_cimy_uef_data`.`VALUE` ELSE NULL END) AS `Club`,
    MIN(CASE WHEN `wpty_cimy_uef_data`.`FIELD_ID` = 9 THEN `wpty_cimy_uef_data`.`VALUE` ELSE NULL END) AS `State`
 FROM
    `wpty_users`
    LEFT JOIN `wpty_cimy_uef_data` ON `wpty_users`.`ID` = `wpty_cimy_uef_data`.`USER_ID`
GROUP BY `wpty_cimy_uef_data`.`USER_ID`
HAVING `State` = 'SA'
ORDER BY `wpty_users`.`user_login`
...