MySQL查询显示结果,但我不能被他们限制?

Posted

技术标签:

【中文标题】MySQL查询显示结果,但我不能被他们限制?【英文标题】:MySQL query shows results, but I can't restrict by them? 【发布时间】:2011-11-21 15:34:29 【问题描述】:

您好,我有这样的疑问

SELECT 
    videos.*, 
    categories.cat_name , 
    ( SELECT COUNT( * ) AS count FROM user_favorites WHERE user_id = 'tw415656866' AND video_id = videos.video_id )is_favorite 
FROM `videos` 
INNER JOIN categories 
    ON categories.cat_id = videos.cat_id 
WHERE 
    date <= '2011-11-21 09:12:18' 
GROUP BY videos.video_id 
ORDER BY (votesdown / votesup) ASC 
LIMIT 0, 5 

此代码运行良好,并返回如下表

video_id     - 视频 ID cat_name   - 类别名称 cat_id         - 类别 ID 标题            - 视频标题 yt_id           - youtube 视频 ID votesup      - 投票 投反对票 - 投反对票 日期           - 添加日期 已发推文       - 0 / 1(1=已发推文) is_favorite   - 0 / 1(1=收藏)

我想要做的是将这个添加到 WHERE 子句中

AND is_favorite = 1

如您所见,“is_favorite”作为列添加到数据集中,但我无法查询它,因为 mysql 说“is_favorite”列不存在。

确切的错误是... " 'where 子句' 中的未知列 'is_favorite'"

有什么想法吗?

非常感谢

【问题讨论】:

【参考方案1】:

is_favorite 确实不是列,而是子查询的别名。尝试使用

HAVING is_favorite = 1

相反。有关WHEREHAVING 之间区别的说明,请参见例如http://www.w3schools.com/sql/sql_having.asp

所以你的查询应该是这样的:

SELECT 
    videos.*, 
    categories.cat_name , 
    ( SELECT COUNT( * ) AS count FROM user_favorites WHERE user_id = 'tw415656866' AND video_id = videos.video_id ) AS is_favorite 
FROM `videos` 
INNER JOIN categories ON categories.cat_id = videos.cat_id 
WHERE date <= '2011-11-21 09:12:18' 
GROUP BY videos.video_id 
HAVING is_favorite = 1
ORDER BY (votesdown / votesup) ASC 
LIMIT 0, 5 

【讨论】:

这完美!非常感谢。 2 小时的问题按 20 个字符排序。马上!【参考方案2】:

由于查询的处理顺序,is_favorite 别名在评估 WHERE 子句时不可用。您需要在 WHERE 中重复子查询。

【讨论】:

我明白了,您知道是否有更好更有效的查询方式吗?【参考方案3】:

您的查询:

SELECT 
    videos.*, 
    categories.cat_name , 
    T.is_favorite 
FROM `videos` 
INNER JOIN categories 
    ON categories.cat_id = videos.cat_id 
Inner join 
    ( SELECT video_id, COUNT( * ) AS IsFavorite
      FROM user_favorites  
      WHERE user_id = 'tw415656866' 
      Group by video_id ) T 
        On  T.video_id = videos.video_id 
WHERE 
    date <= '2011-11-21 09:12:18' 
  And T.isFavorite =1
GROUP BY videos.video_id 
ORDER BY (votesdown / votesup) ASC 
LIMIT 0, 5 

【讨论】:

以上是关于MySQL查询显示结果,但我不能被他们限制?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL降序限制

mysql中,啥是视图,视图的作用是啥

具有限制和偏移量的 CodeIgniter sql 查询未显示结果

mysql 查询结果显示宽度

查询以显示 mysql 数据库中 B-Tree 索引的限制

Oracle 查询:如何将返回的记录限制为计数 > 1 但显示完整结果的记录?