MySQL WHERE заканчивается как имя столбца «неизвестно»

php mysql

152 просмотра

1 ответ

У меня есть следующий запрос MySQL.

SELECT 
p.`id` as id, 
p.`postinguser` as postinguser,
p.`page` as page,
p.`likedby` as likedby,
p.`redwabled` as redwabled,
case r.`redwabledby`
when '5' then r.`time`
else p.`time`
end as date_time 
FROM `uc_posts` p left join `uc_redwables` r on p.id = r.dwable
WHERE (p.`postinguser` = '5' OR find_in_set('5',p.`redwabled`)) AND (p.`time` < '2016-08-19 12:31:12') order by date_time desc LIMIT 20

Это объединяет информацию из двух разных таблиц и возвращает следующий пакет результатов:

введите описание изображения здесь

Моя проблема в том, что я хочу изменить WHEREстроку запроса на:

WHERE (p.`postinguser` = '5' OR find_in_set('5',p.`redwabled`)) AND (date_time < '2016-08-19 12:31:12') order by date_time desc LIMIT 20

Так что он выбирает только завершенный разбор по строке с date_timeUnder 2016-08-19 12:31:12. Это исключило бы id: 316в этом примере (который имеет p.time ниже, но это r.time выше). Однако сейчас я просто получаю сообщение об ошибке «неизвестный столбец», предположительно потому, что столбец на самом деле не существует.

Может ли кто-нибудь найти способ сделать это?

Для справки это изображение другой таблицы:

введите описание изображения здесь

Спасибо

Автор: Ben Источник Размещён: 08.11.2019 11:07

Ответы (1)


2 плюса

Решение

Причина, по которой вы получаете эту ошибку, заключается в том, что date_timeэто псевдоним , и MySQL оценивает WHEREпредложение до того, как этот псевдоним может существовать.

У вас есть два варианта здесь. Вы можете переместить CASEвыражение в WHEREпредложение:

WHERE (p.postinguser = '5' OR find_in_set('5',p.redwabled)) AND
      CASE r.redwabledby WHEN '5'
                         THEN r.time < '2016-08-19 12:31:12'
                         ELSE p.time < '2016-08-19 12:31:12'
      END

Или вы можете использовать псевдоним, date_timeкак непосредственно в HAVINGпредложении. То есть используйте следующие пункты WHEREи HAVINGпункты:

WHERE (p.postinguser = '5' OR find_in_set('5',p.redwabled))
HAVING date_time < '2016-08-19 12:31:12'

Причина, по которой вы можете использовать date_timeэто HAVINGпредложение, состоит в том, что это предложение оценивается после вычисления псевдонимов. Обычно HAVINGприменяет фильтр к каждой группе в запросе агрегации. Но, так как вы использовали GROUP BY, HAVINGпункт будет применяться к каждой записи.

Автор: Tim Biegeleisen Размещён: 20.08.2016 09:52
Вопросы из категории :
32x32