我有一张类似的表:
----------------------------------
| 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
添加到查询中,但看起来这是在分组之后发生的。
有更好的方法吗?
答案 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 BY
,GROUP_CONCAT
和SUBSTRING_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,那就没问题。