Mysql 如何排除列值重复的行,并在删除重复项之前按ID列表对结果进行排序?
我有一张类似的桌子:Mysql 如何排除列值重复的行,并在删除重复项之前按ID列表对结果进行排序?,mysql,sql,Mysql,Sql,我有一张类似的桌子: ---------------------------------- | id | user_id | likes | ---------------------------------- | 1 | 1 | dogs | | 2 | 1 | cats | | 3 | 2 | fish | | 4 | 2 | s
----------------------------------
| id | user_id | likes |
----------------------------------
| 1 | 1 | dogs |
| 2 | 1 | cats |
| 3 | 2 | fish |
| 4 | 2 | snakes |
| 5 | 1 | pandas |
| 6 | 1 | fish |
----------------------------------
我有一个用于检索行的id
s列表,但我只希望每个用户返回一行(ids对应于多个用户的行)。列表将仅为表中的部分ID
,而不是全部ID。例如:
2,1,3,6
如果列表中有多个id
s属于同一用户,我想检索列表中第一个出现的id
的行
在上面的示例中,对于user\u id
1,应返回id
=2的行,对于user\u id
2,应返回id
=3的行
我可以使用分组依据
,而不使用聚合:
SELECT id, user_id, likes
FROM my_table
WHERE id IN (2,1,3,6)
GROUP BY user_id
但从我所读到的来看,这样做在语义上是不正确的。这也不会返回列表中第一个出现的id
的行,而是返回具有最低id
的行(因此,当我想要获得id
=2的行时,id
=1的行被返回给user\u id
=1)。我尝试向查询中添加orderbyfield
,但似乎这是在分组之后发生的
有更好的方法吗?您可以尝试在WHERE using TOP中执行子查询,如下所示:
SELECT id, user_id, likes
FROM my_table
WHERE id IN (SELECT TOP 1 id FROM tableids WHERE mytable.userid = userid)
GROUP BY user_id
或者,如果您在其他查询中没有用户ID,只需使用TOP
就可以了。以下是我的建议:
SELECT Table1.* FROM Table1
JOIN (
SELECT t.user_id, SUBSTRING_INDEX(GROUP_CONCAT(t.id ORDER BY FIELD(t.id, 2,1,3,6)),',', 1) AS firstRowPerUser
FROM Table1 t
WHERE t.id IN (2,1,3,6)
GROUP BY t.user_id) tRes ON Table1.id=tRes.firstRowPerUser;
使用带有分组依据
、分组内容
和子字符串索引
的子查询,从每个用户的自定义列表中获取用户列表和第一条记录的id。
然后将结果与初始表连接起来。不是很清楚。。。。那么,对于用户1,您有ID 2,1,3,那么用户2呢?您将有一组不同的ID,并且您希望在最后同时接收用户1和用户2,每个用户都有来自给定列表的第一条记录?您能否给出一个有2个用户和预期输出的示例,please@cyadvertID列表用于属于多个用户的行。在多于一个ID属于单个用户的情况下,我想返回具有列表中第一个ID的行,排除其他行。如果您愿意,请考虑以下简单的两步过程:1。如果您还没有这样做,请提供适当的DDL(和/或SQLFIDLE),以便我们可以更轻松地复制问题。2.如果您还没有这样做,请提供与步骤1中提供的信息相对应的所需结果集。明白了。具有挑战性的我会试着做点什么。如果找到解决方案,将发布。可能需要多个子查询。每个用户:(问题似乎是关于MySQL的