mySQL - 放入列的正确方法(UNION 或其他?)

标签 mysql sql database

我试图找出为什么它给我 2 行而不是 1 行,正如您在“0130”行中看到的那样。基本上我想做的是获取敌人名称并根据服务器和状态中的联盟数量进行检查(取决于用户选择的内容,服务器将始终是整个数字,而状态会有所不同)。

第一个 UNION 显示整个服务器(始终相同的数字) 第二个 UNION 显示取决于用户选择的状态(基于分组依据的随机数)

除非我在查询中的想法完全错误,否则我很想听听正确的方法是什么!

SELECT
    ASEnemy,ASFlagStatus,COUNT(SCAlliance) Server,0 State
    FROM AllianceStatus
    INNER JOIN SC75 ON (SCAlliance = ASEnemy AND SCSnap = (SELECT MAX(DSSnap) FROM DataSnap WHERE DSServer = 75))
    WHERE ASServer = 75
    AND ASOurs = '1057'
    AND (((SCFieldID % 800) >= 0 AND (SCFieldID % 800) <= 799) AND (FLOOR(SCFieldID / 800) >= 0 AND FLOOR(SCFieldID / 800) <= 799))
    GROUP BY BINARY SCAlliance
UNION ALL
SELECT
    ASEnemy,ASFlagStatus,0 Server,COUNT(SCAlliance) State
    FROM AllianceStatus
    INNER JOIN SC75 ON (SCAlliance = ASEnemy AND SCSnap = (SELECT MAX(DSSnap) FROM DataSnap WHERE DSServer = 75))
    WHERE ASServer = 75
    AND ASOurs = '1057'
    AND (((SCFieldID % 800) >= 400 AND (SCFieldID % 800) <= 599) AND (FLOOR(SCFieldID / 800) >= 600 AND FLOOR(SCFieldID / 800) <= 799))
    GROUP BY BINARY SCAlliance
    ORDER BY ASFlagStatus,BINARY ASEnemy
LIMIT 100

上面使用 mySQL 的当前输出示例:

ASEnemy ASFlag  Server  State
000001  1       398         0
0130    1       699         0
0130    1       0           263
04      1       240         0
04      1       0           22
08      1       456         0
08      1       0           3
1001    1       870         0
1001    1       0           438

我想看到的输出是:

ASEnemy ASFlag  Server  State
000001  1       398         0
0130    1       699         263
04      1       240         22
08      1       456         3
1001    1       870         438

提前致谢!

最佳答案

要获得您想要的输出,您可以将原始查询包装在另一个查询中以获取每组的最大值:

SELECT ASEnemy, ASFlagStatus, MAX(Server) Server, MAX(State) State
FROM (
-- your original query here
) src
GROUP BY ASEnemy, ASFlagStatus

或者您可以重写它并通过移动 count 函数中 case 表达式内不同的条件部分来使用条件聚合。

它可能看起来像这样(但我显然已经测试过它,因为没有可供测试的示例数据):

SELECT
 ASEnemy,
 ASFlagStatus,
 COUNT(CASE WHEN (((SCFieldID % 800) >= 0 AND (SCFieldID % 800) <= 799) AND (FLOOR(SCFieldID / 800) >= 0 AND FLOOR(SCFieldID / 800) <= 799)) THEN SCAlliance ELSE NULL END) Server,
 COUNT(CASE WHEN (((SCFieldID % 800) >= 400 AND (SCFieldID % 800) <= 599) AND (FLOOR(SCFieldID / 800) >= 600 AND FLOOR(SCFieldID / 800) <= 799)) THEN SCAlliance ELSE NULL END) State
FROM AllianceStatus
INNER JOIN SC75 ON (SCAlliance = ASEnemy AND SCSnap = (SELECT MAX(DSSnap) FROM DataSnap WHERE DSServer = 75))
WHERE ASServer = 75
  AND ASOurs = '1057'
GROUP BY BINARY SCAlliance
ORDER BY ASFlagStatus,BINARY ASEnemy
LIMIT 100

关于mySQL - 放入列的正确方法(UNION 或其他?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36073329/

相关文章:

php - 图像未从 php 插入到 mysql 数据库

mysql - 未知的复合列名称

mysql - cakePHP 有一个空

使用 CUDA 实现 MySQL

mysql - 如何在 SQL 中获取三个连接中的第二个的最后一条记录

mysql - SUM(MAX( ) + MAX( )) 怎么做?

mysql - 复制行时默认插入日期列的 INTO 值,如何操作?

javascript - 如何检查 node-orm 中的列是否有 NULL 值

database - Web2py 数据库连接和数据库设计

sql - MySQL 问题 - 如何处理多种类型的用户 - 一个表或多个?