如何排除具有重复列值的行,并在删除重复项之前按ID列表对结果进行排序?

时间:2015-03-18 14:02:41

标签: mysql sql

我有一张类似的表:

----------------------------------
| id    |   user_id   |  likes   |
----------------------------------
|  1    |      1      |  dogs    | 
|  2    |      1      |  cats    | 
|  3    |      2      |  fish    | 
|  4    |      2      |  snakes  | 
|  5    |      1      |  pandas  | 
|  6    |      1      |  fish    | 
----------------------------------

我有一个id的列表,我将用它来检索行,但我只想为每个用户返回一行(id s对应于多个用户的行)。该列表只是表中ids的一部分,而不是全部。例如:

2,1,3,6 

如果列表中的多个id属于同一个用户,我想检索列表中首先出现的id行。

在上面的示例中,应为id 1返回user_id = 2行,id = 2应返回user_id = 3行。

我可以使用GROUP BY而不使用聚合:

SELECT id, user_id, likes
FROM my_table
WHERE id IN (2,1,3,6)
GROUP BY user_id

但是从我读过的内容来看,这在语义上是不正确的。这也不会返回列表中第一个出现的id行,而是返回最低id的行(因此返回id = 1的行user_id 1,当我想获得id = 2行时。我尝试将ORDER BY FIELD添加到查询中,但看起来这是在分组之后发生的。

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我建议:

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;

使用带有GROUP BYGROUP_CONCATSUBSTRING_INDEX的子查询,从每个用户的自定义列表中获取用户列表和第一条记录的ID。 然后只用JOIN初始表的结果。

答案 1 :(得分:-1)

您可以尝试使用TOP在WHERE中执行子查询,如下所示:

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

或者,如果您在其他查询中没有使用TOP的用户ID,那就没问题。