【问题标题】:MySQL query shows results, but I can't restrict by them?MySQL查询显示结果,但我不能被他们限制?
【发布时间】: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'"

有什么想法吗?

非常感谢

【问题讨论】:

    标签: php mysql sql phpmyadmin


    【解决方案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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多