[英]want to remove duplicates in SQL
我正在用 rails 创建一个应用程序。
我不知道如何编写 SQL 语句,所以请教我。
由此,通过“competition_id”缩小范围并仅提取具有最小“id”的项目。
例如,
+----------------+----+---------------------------+----------------+-------+-----+
| competition_id | id | image | name | count | rnk |
+----------------+----+---------------------------+----------------+-------+-----+
| 1 | 4 | monster4.jpeg | monster4 | 7 | 1 |
| 2 | 6 | monster2.jpeg | monster2 | 1 | 1 |
| 3 | 9 | monster1.jpeg | monster1 | 1 | 1 |
| 5 | 22 | drink_sample.jpeg | drink6 | 2 | 1 |
| 6 | 33 | sumo_wrestler_sample.jpeg | sumo_wrestler7 | 2 | 1 |
| 7 | 40 | movie_sample.jpeg | movie4 | 2 | 1 |
| 8 | 50 | food_sample.jpeg | food4 | 2 | 1 |
| 9 | 61 | color_sample.jpeg | color5 | 3 | 1 |
| 10 | 72 | book_sample.jpeg | book6 | 2 | 1 |
| 11 | 82 | book_sample.jpeg | book6 | 3 | 1 |
+----------------+----+---------------------------+----------------+-------+-----+
+----------------+----+---------------------------+----------------+-------+-----+
| competition_id | id | image | name | count | rnk |
+----------------+----+---------------------------+----------------+-------+-----+
| 1 | 4 | monster4.jpeg | monster4 | 7 | 1 |
| 2 | 6 | monster2.jpeg | monster2 | 1 | 1 |
| 3 | 9 | monster1.jpeg | monster1 | 1 | 1 |
| 5 | 22 | drink_sample.jpeg | drink6 | 2 | 1 |
| 6 | 33 | sumo_wrestler_sample.jpeg | sumo_wrestler7 | 2 | 1 |
| 6 | 34 | sumo_wrestler_sample.jpeg | sumo_wrestler8 | 2 | 1 |
| 6 | 35 | sumo_wrestler_sample.jpeg | sumo_wrestler9 | 2 | 1 |
| 7 | 40 | movie_sample.jpeg | movie4 | 2 | 1 |
| 7 | 43 | movie_sample.jpeg | movie7 | 2 | 1 |
| 7 | 45 | movie_sample.jpeg | movie9 | 2 | 1 |
| 8 | 50 | food_sample.jpeg | food4 | 2 | 1 |
| 8 | 56 | food_sample.jpeg | food10 | 2 | 1 |
| 9 | 61 | color_sample.jpeg | color5 | 3 | 1 |
| 10 | 72 | book_sample.jpeg | book6 | 2 | 1 |
| 11 | 82 | book_sample.jpeg | book6 | 3 | 1 |
+----------------+----+---------------------------+----------------+-------+-----+
提取这个的代码
SELECT * FROM (SELECT *,RANK() OVER (PARTITION BY competition_id ORDER BY COUNT DESC) rnk FROM (SELECT items.competition_id,items.id,items.image,items.name,count(*) AS count FROM chosenitems INNER JOIN items ON chosenitems.item_id = items.id GROUP BY items.competition_id,items.id) AS t) AS tt WHERE rnk = 1;
ID | session_id | item_id |
---|---|---|
1 | 1 | 2 |
2 | 1 | 3 |
2 | 1 | 2 |
2 | 1 | 2 |
2 | 1 | 5 |
3 | 1 | 7 |
4 | 1 | 4 |
5 | 1 | 5 |
ID | 姓名 | 图片 | 比赛编号 |
---|---|---|---|
1 | 一个 | 图像1 | 1 |
2 | b | 图2 | 1 |
2 | c | 图2 | 1 |
2 | d | 图2 | 1 |
2 | e | 图5 | 2 |
3 | F | 图 9 | 2 |
4 | G | 图4 | 2 |
5 | H | 图5 | 2 |
SELECT * FROM (SELECT *,RANK() OVER (PARTITION BY competition_id ORDER BY COUNT DESC) rnk FROM (SELECT items.competition_id,items.id,items.image,items.name,count(*) AS count FROM chosenitems INNER JOIN items ON chosenitems.item_id = items.id GROUP BY items.competition_id,items.id) AS t) AS tt WHERE id in (SELECT MIN(id) FROM chosenitems GROUP BY competition_id);
↓
失败
+----------------+----+---------------+----------+-------+-----+
| competition_id | id | image | name | count | rnk |
+----------------+----+---------------+----------+-------+-----+
| 1 | 1 | monster1.jpeg | monster1 | 4 | 2 |
+----------------+----+---------------+----------+-------+-----+
我想从“rnk”为1的每个“competition_id”中提取ID最小的那个。
macOS 大苏尔
ruby 2.7.0
导轨 6.1.1
mysql 版本 8.0.23
这应该会给您想要的结果,您必须检查MIN
是否是每个值的正确选择
SELECT
competition_id
,MIN(id) as id
,MIN(mage) as image
,MIN(ame) as name
,MIN(count) as count
,MIN(rnk) as rnk
FROM
(SELECT
*
,RANK() OVER (PARTITION BY competition_id ORDER BY COUNT DESC) rnk
FROM (SELECT
items.competition_id
,items.id
,items.image
,items.name
,count(*) AS count
FROM
chosenitems INNER JOIN items ON chosenitems.item_id = items.id
GROUP BY items.competition_id,items.id) AS t) AS tt
WHERE rnk = 1
GROUP BY competition_id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.