MySQL WHERE以列名结尾' unknown'

时间:2016-08-20 09:40:35

标签: php mysql

我有以下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

这会整理来自两个不同表格的信息,并返回以下一批结果:

enter image description here

我的问题是我想将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;错误信息,大概是因为专栏实际上并不存在。

有人可以找到这样做的方法吗?

作为参考,这是另一张表的图像:

enter image description here

由于

1 个答案:

答案 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。也就是说,使用以下WHEREHAVING子句:

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子句将适用于每条记录。