我有三个表:类别,故事和术语。条款表存储类别和故事的关系。每个故事可以分配一个或多个类别。我想为故事选择一个类别。我在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?
答案 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_id
和stories
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