首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL -连接/组协作返回太多项

MySQL -连接/组协作返回太多项
EN

Stack Overflow用户
提问于 2020-12-03 21:57:27
回答 3查看 80关注 0票数 0

我有一个简单的查询,它在一个面对面的比赛表中显示赢、平和输。

代码语言:javascript
运行
复制
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

平安无事。我只得到一行,所需的数据作为列。

现在,我还想拿出最近的三次比赛日期的组列表。我试过:

代码语言:javascript
运行
复制
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替换为

代码语言:javascript
运行
复制
GROUP_CONCAT((SELECT date FROM 6dos7me3xn8 ORDER BY date DESC LIMIT 3)) AS recent

带有“Subquery返回超过1行”的错误的...but。

我肯定这很简单,但我做错什么了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-03 22:01:23

如果您运行的是MySQL 8.0,您可以使用窗口函数来完成此操作:

代码语言:javascript
运行
复制
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。

在早期版本中,更简单的方法可能是限制行的子查询:

代码语言:javascript
运行
复制
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`
票数 1
EN

Stack Overflow用户

发布于 2020-12-03 21:59:59

你在做cross join。要获得最近的三次约会,您可以使用:

代码语言:javascript
运行
复制
FROM (SELECT mn.*, DENSE_RANK() OVER (ORDER BY date desc) as seqnum
      FROM 6dos7me3xn8 mn
     ) mn
WHERE seqnum <= 3
票数 1
EN

Stack Overflow用户

发布于 2020-12-03 22:02:41

您没有ON子句来指定子查询与要将其连接到的表之间的关系。所以你得到了一个完整的交叉积。

您还需要ORDER BY使其返回3个最近的日期,而不是任何3个日期。

代码语言:javascript
运行
复制
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.date
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65134753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档