2011-11-21 116 views
1

您好我有一個像這樣MySQL查詢顯示結果,但我不能限制他們?

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                       - youtubes視頻ID
votesup             - 票向上
votesdown     - 票向下
日期                        - 日期加入
啾啾              - 0/1( 1 =推特)
is_favorite       - 0/1(1 =最愛)

我想要做的就是它添加到WHERE子句

AND is_favorite = 1 

正如你可以看到 'is_favorite' 被添加到該數據集作爲列,但我不能查詢它,因爲MySQL說'is_favorite'列不存在。

確切的錯誤是... 「未知列 'is_favorite' 在 'where子句'」

任何想法?

非常感謝

回答

3

is_favorite確實不是列而是子查詢的別名。嘗試使用

HAVING is_favorite = 1 

改爲。例如見http://www.w3schools.com/sql/sql_having.asp的差異WHEREHAVING

之間的解釋所以您的查詢應該是這樣的:

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 
+0

這完美的作品!非常感謝。 2小時的問題分爲20個字符。對! –

1

由於查詢所處理的順序,所述is_favorite別名不可用當時的WHERE子句進行評價。你需要在WHERE中重複子查詢。

+0

我明白了,你知道,如果那裏有一個更好的更有效的方式我的查詢? –

0

您的疑問:

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