0

询问:

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)
4

3 回答 3

4

select distinct适用于被提取的行,而不是该行中的单个字段。结果集中的每一行都是不同的。

于 2012-11-14T14:36:57.047 回答
0

DISTINCT应用于整行,因为这些keyword列对于它们匹配条件的不同行有多个值DISTINCT。如果要返回一行,则需要确定keyword要返回的值。

如果要将值连接在一起,则可以使用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  |
于 2012-11-14T14:41:05.230 回答
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;
于 2012-11-14T14:41:10.397 回答