我有一个简单的查询,它在一个面对面的比赛表中显示赢、平和输。
SELECT
SUM(CASE WHEN score_w > score_m THEN 1 ELSE 0 END) AS wins_w,
SUM(CASE WHEN score_m > score_w THEN 1 ELSE 0 END) AS wins_m,
SUM(CASE WHEN score_w = score_m THEN 1 ELSE 0 END) AS draws
FROM 6dos7me3xn8平安无事。我只得到一行,所需的数据作为列。
现在,我还想拿出最近的三次比赛日期的组列表。我试过:
SELECT
SUM(CASE WHEN mn.score_w, 0) > mn.score_m THEN 1 ELSE 0 END) AS wins_w,
SUM(CASE WHEN mn.score_m > mn.score_w THEN 1 ELSE 0 END) AS wins_m,
SUM(CASE WHEN mn.score_w = mn.score_m THEN 1 ELSE 0 END) AS draws,
GROUP_CONCAT(jn.date) AS recent
FROM 6dos7me3xn8 mn
JOIN (SELECT date FROM 6dos7me3xn8 ORDER BY date DESC LIMIT 3) jn...but the LIMIT没有效果,看起来--我得到了约会组的,而不仅仅是3。
我还尝试删除JOIN并将GROUP_CONCAT替换为
GROUP_CONCAT((SELECT date FROM 6dos7me3xn8 ORDER BY date DESC LIMIT 3)) AS recent带有“Subquery返回超过1行”的错误的...but。
我肯定这很简单,但我做错什么了?
发布于 2020-12-03 22:01:23
如果您运行的是MySQL 8.0,您可以使用窗口函数来完成此操作:
select
sum(score_w > score_m) as wins_w,
sum(score_m > score_w) as wins_m,
sum(score_w = score_m) as draws,
group_concat(case when rn <= 3 then date end) as recent
from (
select t.*, row_number() over(order by date desc) rn
from `6dos7me3xn8` t
) t子查询按降序日期对记录进行排序;然后我们可以在外部查询中使用该信息。请注意,您不需要case表达式: MySQL在数字对撞机中将true/false条件计算为1/0。
在早期版本中,更简单的方法可能是限制行的子查询:
select
sum(score_w > score_m) as wins_w,
sum(score_m > score_w) as wins_m,
sum(score_w = score_m) as draws,
(select group_concat(date) from (select date from `6dos7me3xn8` order by date desc limit 3) t) as recent
from `6dos7me3xn8`发布于 2020-12-03 21:59:59
你在做cross join。要获得最近的三次约会,您可以使用:
FROM (SELECT mn.*, DENSE_RANK() OVER (ORDER BY date desc) as seqnum
FROM 6dos7me3xn8 mn
) mn
WHERE seqnum <= 3发布于 2020-12-03 22:02:41
您没有ON子句来指定子查询与要将其连接到的表之间的关系。所以你得到了一个完整的交叉积。
您还需要ORDER BY使其返回3个最近的日期,而不是任何3个日期。
SELECT
SUM(CASE WHEN mn.score_w, 0) > mn.score_m THEN 1 ELSE 0 END) AS wins_w,
SUM(CASE WHEN mn.score_m > mn.score_w THEN 1 ELSE 0 END) AS wins_m,
SUM(CASE WHEN mn.score_w = mn.score_m THEN 1 ELSE 0 END) AS draws,
GROUP_CONCAT(jn.date) AS recent
FROM 6dos7me3xn8 mn
JOIN (
SELECT DISTINCT date
FROM 6dos7me3xn8
ORDER BY date DESC
LIMIT 3
) jn ON jn.date = mn.datehttps://stackoverflow.com/questions/65134753
复制相似问题