1

我有三个表:类别、故事和术语。术语表存储类别和故事关系。每个故事都可以分配一个或多个类别。我只想为故事选择一个类别。我DISTINCT在 story_id 上使用了子句,但它没有用。请参阅以下查询

SELECT DISTINCT S.story_id, C.cat_id 
  FROM stories S JOIN terms C USING(story_id) 
 LIMIT 3;

和结果

+----------+--------+
| 故事ID | cat_id |
+----------+--------+
| 115 | 17 |
| 115 | 20 |
| 115 | 21 |
+----------+--------+
3 行一组(0.00 秒)

任何线索为什么它没有获取唯一的story_id?

4

3 回答 3

5

...任何线索为什么它没有拾取独特的story_id?

它不会返回唯一的 story_id,因为它DISTINCT适用于子句中的所有列SELECT,而不是单个列。


由于您...只想为故事选择一个类别...您可以使用聚合函数MIN()MAX()withGROUP BY来做到这一点

SELECT s.story_id, MIN(c.cat_id) cat_id
  FROM stories s JOIN terms c 
    ON s.story_id = c.story_id
 GROUP BY s.story_id

现在因为你只是回来story_idcat_id你甚至不需要加入storiesterms

SELECT story_id, MIN(cat_id) cat_id
  FROM terms
 GROUP BY story_id 

这是SQLFiddle演示

于 2013-07-25T04:00:23.410 回答
1

DISTINCT S.story_id, C.cat_id会将 story_id 和 cat_id 视为一个实体并删除重复项。如果您需要与众不同story_id,那么您可以在下面尝试

SELECT S.story_id, C.cat_id FROM stories AS S
INNER JOIN terms AS C ON(S.cat_id = C.cat_id)
GROUP BY S.story_id
HAVING COUNT(*) >=1
于 2013-07-25T04:01:00.177 回答
0

尝试这个 :

SELECT DISTINCT S.story_id, C.cat_id FROM stories AS S
INNER JOIN terms AS C ON(S.cat_id = C.cat_id)
GROUP BY S.story_id
于 2013-07-25T03:54:49.250 回答