这个查询怎么写?

数据表如图

需要查询 fid 为2,3 的数据, 并且每个fid下只取2条数据, 这个sql怎么写

阅读 1.8k
5 个回答

Mysql8.0版本以上,可以用窗口函数row_number()来实现

  • 使用LIMIT和OFFSET子句,例如:SELECT * FROM table WHERE fid IN (2,3) ORDER BY fid LIMIT 2 OFFSET 0; 这个语句会返回fid为2的前两条数据,如果要返回fid为3的前两条数据,可以把OFFSET改为2。
  • 使用ROW_NUMBER()函数,例如:SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY fid ORDER BY id) AS rn FROM table) AS t WHERE fid IN (2,3) AND rn <= 2; 这个语句会根据fid分组,并按照id排序,然后返回每组的前两条数据。
  • 使用子查询和JOIN,例如:SELECT t1.* FROM table t1 JOIN (SELECT fid, MIN(id) AS min_id FROM table GROUP BY fid) t2 ON t1.fid = t2.fid AND t1.id = t2.min_id WHERE t1.fid IN (2,3) UNION SELECT t1.* FROM table t1 JOIN (SELECT fid, MIN(id) AS min_id FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY fid) GROUP BY fid) t2 ON t1.fid = t2.fid AND t1.id = t2.min_id WHERE t1.fid IN (2,3); 这个语句会先找出每个fid的最小id,然后用UNION合并两个结果集,最后返回每个fid的前两条数据。
新手上路,请多包涵

有个想法 分别查询fid为2 和 3 数据,并limit 2 然后union all 一下

SELECT *
FROM a
WHERE fid IN (2, 3)
GROUP BY fid, id
HAVING COUNT(*) <= 2

这个查询语句中的 WHERE 子句限定了查询的条件,只查询 fid 为 2 或 3 的数据。GROUP BY 子句将查询结果按照 fid 和 id 进行分组,HAVING 子句则筛选出每个分组下数量不超过 2 条数据的结果,即每个 fid 下只取 2 条数据。最后,SELECT * 则选择所有符合条件的数据。

(SELECT * FROM test_user WHERE fid = 2 LIMIT 2)
UNION
(SELECT * FROM test_user WHERE fid = 3 LIMIT 2);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题