Mysql 从一对多表中选择不同的值
我有三个表格:类别、故事和术语。术语表存储类别和故事关系。每个故事可以指定一个或多个类别。我只想为一个故事选择一个类别。我在story\u id上使用了Mysql 从一对多表中选择不同的值,mysql,sql,Mysql,Sql,我有三个表格:类别、故事和术语。术语表存储类别和故事关系。每个故事可以指定一个或多个类别。我只想为一个故事选择一个类别。我在story\u 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 | +--
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)
+----------+--------+
|故事|猫| id|
+----------+--------+
| 115 | 17 |
| 115 | 20 |
| 115 | 21 |
+----------+--------+
一组3行(0.00秒)
有什么线索说明为什么它没有找到唯一的故事id吗?试试这个:
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
试试这个:
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
…有没有线索说明为什么它没有收集到独特的故事id
它不会返回唯一的故事id,因为DISTINCT
将应用于SELECT
子句中的所有列,而不是单个列
因为您…只想为一个故事选择一个类别。。。您可以将聚合函数
MIN()
或MAX()
与groupby
一起使用来完成此操作
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\u id
和cat\u id
,因此您甚至不需要加入stories
和terms
SELECT story_id, MIN(cat_id) cat_id
FROM terms
GROUP BY story_id
这里是演示
…有没有线索说明为什么它没有收集到独特的故事id
它不会返回唯一的故事id,因为DISTINCT
将应用于SELECT
子句中的所有列,而不是单个列
因为您…只想为一个故事选择一个类别。。。您可以将聚合函数
MIN()
或MAX()
与groupby
一起使用来完成此操作
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\u id
和cat\u id
,因此您甚至不需要加入stories
和terms
SELECT story_id, MIN(cat_id) cat_id
FROM terms
GROUP BY story_id
这里是<强> <强> demo < /p> < p> <代码> S.SturySyID,C.CasyId >将SturySyID和CasyID视为一个实体,并删除重复。如果您需要获得不同的
故事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
<代码> S.SturySyID,C.CasyId将将SturySyID和CasyID视为一个实体并删除重复。如果您需要获得不同的
故事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
切勿混合
DISTINCT
和groupby
切勿混合DISTINCT
和groupby
谢谢您的解释谢谢您的解释