数据表如图
需要查询 fid 为2,3 的数据, 并且每个fid下只取2条数据, 这个sql怎么写
SELECT * FROM table WHERE fid IN (2,3) ORDER BY fid LIMIT 2 OFFSET 0;
这个语句会返回fid为2的前两条数据,如果要返回fid为3的前两条数据,可以把OFFSET改为2。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排序,然后返回每组的前两条数据。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的前两条数据。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);
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
5 回答1.4k 阅读
Mysql8.0版本以上,可以用窗口函数row_number()来实现