我有以下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_time
下选择带有2016-08-19 12:31:12
的已完成整理的整理行。这将在此示例中排除id: 316
(其中p.time低于但它的r.time更高)。但是现在我只是得到一个未知的专栏&#39;错误信息,大概是因为专栏实际上并不存在。
有人可以找到这样做的方法吗?
作为参考,这是另一张表的图像:
由于
答案 0 :(得分: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
子句将适用于每条记录。