Игнорировать поле, используемое в предложении HAVING в SELECT

У меня такой запрос.

SELECT parent.id AS 'id', parent.CA_NAME as 'name', node.level AS 'level', midpoint.level AS 'midpointlevel', SUM(ad.id IS NOT NULL) AS 'count'
FROM
category AS parent,
category AS midpoint,
category AS node
LEFT JOIN ad ON ad.id=node.id
AND ad.status='A'
WHERE (node.`LEFT` BETWEEN parent.`LEFT` AND parent.`RIGHT`)
AND (node.`LEFT` BETWEEN midpoint.`LEFT` AND midpoint.`RIGHT`)
AND midpoint.id='1'
GROUP BY parent.id
HAVING IF(midpoint.level=0, node.level < 2, node.level > 0)
ORDER BY parent.id

Я не хочу выбирать часть midpoint.level AS 'midpointlevel', но если я удалю ее, в предложении имеющегося будет указано сообщение об ошибке: Код ошибки: 1054. Неизвестный столбец 'midpoint.level' в 'предложении наличия'. Может ли кто-нибудь помочь мне удалить ненужный раздел выбора.


person codeGEN    schedule 26.10.2013    source источник
comment
Это действительно хороший вопрос, и я с нетерпением жду адекватного ответа.   -  person    schedule 26.10.2013
comment
В каждой группе есть несколько возможных значений midpoint.level. Что вы хотите использовать?   -  person eggyal    schedule 26.10.2013


Ответы (3)


Самый простой способ - использовать простой подзапрос:

SELECT id, 
       name,
       -- midpointlevel,  <-- commented out, since we don't need this column 
       level, 
       count
FROM (
  SELECT parent.id AS 'id', parent.CA_NAME as 'name', node.level AS 'level',  midpoint.level AS 'midpointlevel', SUM(ad.id IS NOT NULL) AS 'count'
  FROM
  category AS parent,
  category AS midpoint,
  category AS node
  LEFT JOIN ad ON ad.id=node.id
  AND ad.status='A'
  WHERE (node.`LEFT` BETWEEN parent.`LEFT` AND parent.`RIGHT`)
  AND (node.`LEFT` BETWEEN midpoint.`LEFT` AND midpoint.`RIGHT`)
  AND midpoint.id='1'
  GROUP BY parent.id
  HAVING IF(midpoint.level=0, node.level < 2, node.level > 0)
  ORDER BY parent.id
) subquery
person krokodilko    schedule 26.10.2013
comment
спасибо, это работает .. Но как вы думаете, это повлияет на производительность из-за подзапроса. - person codeGEN; 26.10.2013
comment
Нет, в этом случае (прямой подзапрос формы SELECT, без дополнительного предложения WHERE) время выполнения будет точно таким же, как и для исходного запроса. - person krokodilko; 26.10.2013

SELECT имя_столбца, агрегатная функция (имя_столбца) FROM имя_таблицы WHERE имя_столбца значение оператора GROUP BY имя_столбца HAVING значение оператора агрегатной_функции (имя_столбца);

См. Синтаксис выше

person Rohit    schedule 26.10.2013

Вы можете удалить его из выбора, если добавите его в GROUP BY. Не знаком с ИМЕЮЩИМ ЕСЛИ. Попробуй это:

GROUP BY parent.id,midpoint.level
HAVING (midpoint.level=0 AND node.level < 2 AND node.level > 0)
ORDER BY parent.id
person smoore4    schedule 26.10.2013