从一对多表中选择不同的值

时间:2013-07-25 03:50:57

标签: mysql sql

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

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

和结果

+----------+--------+
| story_id | cat_id |
+----------+--------+
|      115 |     17 |
|      115 |     20 |
|      115 |     21 |
+----------+--------+
3 rows in set (0.00 sec)

任何线索为什么它没有拿起独特的story_id?

3 个答案:

答案 0 :(得分:3)

  

...有什么线索为什么它没有拿起独特的story_id?

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


由于您 ...想要为故事选择仅一个类别... ,您可以使用汇总函数MIN()或{{1} } MAX()来做那个

GROUP 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_id,因此您甚至无需加入cat_idstories

terms

这是 SQLFiddle 演示

答案 1 :(得分: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

答案 2 :(得分: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