2012-11-14 68 views
0

QUERY:MySQL的DISTINCT關鍵字不表示不同的行

mysql> SELECT DISTINCT (stories.id), stories.news_type, story_keywords.keyword 
FROM (`stories`) LEFT JOIN `story_keywords` ON `stories`.`id` 
=`story_keywords`.`story_id` 
WHERE `image_full_url` != '' AND `order` != 0 
AND `news_type` IN ('movie_review', 'movie') 
AND `keyword` IN ('topnews', 'toptablet') 
ORDER BY `created` DESC, `order` DESC LIMIT 5; 

結果:(請注意,ID不鮮明)

+--------+--------------+-----------+ 
| id  | news_type | keyword | 
+--------+--------------+-----------+ 
| 100895 | movie_review | topnews | 
| 100895 | movie_review | toptablet | 
| 100798 | movie_review | toptablet | 
| 100060 | movie_review | toptablet | 
| 100060 | movie_review | topnews | 
+--------+--------------+-----------+ 
5 rows in set (0.00 sec) 
+2

'DISTINCT'應用於整個行。所以這些是基於'關鍵字'值差異的'DISTINCT'行。如果您只想返回一個關鍵字,則必須確定要返回哪個值 – Taryn

+0

如果在緊隨「DISTINCT」關鍵字之後刪除空格,會發生什麼情況? – cdhowie

+0

@cdhowie:distinct不是一個函數。這只是一個語法錯誤。 –

回答

4

select distinct適用於行是該行中獲取的,而不是單獨的字段。結果集中的每一行都是不同的。

+0

有沒有辦法只得到一個不同的列?我是否必須使用GROUP ID –

+0

只有當您僅將這一列帶回時。不同的是基於行 –

+1

'選擇不同的x,y,z'基本上等同於'選擇x,y,z組by x,y,z'。如果你想在一個單獨的領域獨立出來,那麼使用'通過該領域組'。 –

0

DISTINCT應用於整行,因爲keyword列對於不同的行具有多個值,因此它們與DISTINCT的標準匹配。如果你想返回一行,那麼你需要決定返回哪個值keyword

如果你想Concat的價值觀在一起,那麼你可以使用GROUP_CONCAT()

SELECT stories.id, stories.news_type, GROUP_CONCAT(story_keywords.keyword) 
FROM (`stories`) 
LEFT JOIN `story_keywords` 
    ON `stories`.`id`=`story_keywords`.`story_id` 
WHERE `image_full_url` != '' AND `order` != 0 
    AND `news_type` IN ('movie_review', 'movie') 
    AND `keyword` IN ('topnews', 'toptablet') 
GROUP BY stories.id, stories.news_type 
ORDER BY `created` DESC, `order` DESC LIMIT 5; 

的數據將返回這樣的:

| id  | news_type | keyword   | 
+--------+--------------+---------------------+ 
| 100895 | movie_review | topnews,toptablet | 
| 100798 | movie_review | toptablet   | 
| 100060 | movie_review | toptablet, topnews | 
0

的DISTINCT選項刪除重複的記錄,而不是字段值。 如果你想選擇不同的ID,那麼你可以使用這個查詢 -

SELECT 
    stories.id, 
    GROUP_CONCAT(stories.news_type), 
    GROUP_CONCAT(story_keywords.keyword) 
FROM (`stories`) 
LEFT JOIN `story_keywords` 
ON `stories`.`id` = `story_keywords`.`story_id` 
WHERE 
    `image_full_url` != '' 
    AND `order` != 0 
    AND `news_type` IN ('movie_review', 'movie') 
    AND `keyword` IN ('topnews', 'toptablet') 
GROUP BY 
    stories.id 
ORDER BY 
    `created` DESC 
, `order` DESC 
LIMIT 
    5;