繁体   English   中英

两个查询结合选择查询

[英]Two queries combine select query

我需要将两个查询合并为一个。

这是第一个查询:

SELECT SUM(a.wert) as get_in, game 
FROM gamelogs a 
WHERE
    a.state = 'bet'
    AND a.game IN (31906,3300223,125140,7119,7130,1210,1141,7350,40002992,400030,40002994,7210,7353,3300099,7378,4000285,4000299,4000297,40002871,40002869,7229,40002867,7114,4000282,4000280,4000275,7093,4000273,4000270,7144,4000266,4000261,4000252,3300248,3300229,7087,102001,7123,3300095,7389,7384,7340,7356,7213,7079,7376,7360,7162,7161,7158,7157,7152,102010,7237,7305,7143,125112,7142,7139,7346,7137,7367,7132,7131,125126,6993,102014,7127,3300210,7124,7122,125134,7362,7354,3300142,7118,7117,125116,7234,7112,7110,7109,3300195,7106,7348,7364,7399,7374,7101,6998,7098,7225,7306,7368,7370,6996,7015,102000,3300134,7238,3100009,7381,1339,170133,3300239,1315,1358,1459,1522,1600,400031674,76000,7400,7242,400034,400032,400029846,400031677,4000295,400036,4000305,31910,319011,4000302,31915,319015,31919,31917,40002302,31921,7413,319017,319019,31955,31957,31923,31926,31908)
    AND MONTH(a.date) = '3' 
    AND YEAR(a.date) = '2020' 
GROUP BY a.game;

第二个查询是:

SELECT SUM(a.wert) as get_out, game 
FROM gamelogs a 
WHERE
    a.state = 'win' 
    AND a.game IN (31906,3300223,125140,7119,7130,1210,1141,7350,40002992,400030,40002994,7210,7353,3300099,7378,4000285,4000299,4000297,40002871,40002869,7229,40002867,7114,4000282,4000280,4000275,7093,4000273,4000270,7144,4000266,4000261,4000252,3300248,3300229,7087,102001,7123,3300095,7389,7384,7340,7356,7213,7079,7376,7360,7162,7161,7158,7157,7152,102010,7237,7305,7143,125112,7142,7139,7346,7137,7367,7132,7131,125126,6993,102014,7127,3300210,7124,7122,125134,7362,7354,3300142,7118,7117,125116,7234,7112,7110,7109,3300195,7106,7348,7364,7399,7374,7101,6998,7098,7225,7306,7368,7370,6996,7015,102000,3300134,7238,3100009,7381,1339,170133,3300239,1315,1358,1459,1522,1600,400031674,76000,7400,7242,400034,400032,400029846,400031677,4000295,400036,4000305,31910,319011,4000302,31915,319015,31919,31917,40002302,31921,7413,319017,319019,31955,31957,31923,31926,31908) 
    AND MONTH(a.date) = '3' 
    AND YEAR(a.date) = '2020' 
GROUP BY a.game;

这两个查询是相似的,唯一的区别是 state = bet/win。 如何将它们组合成一个查询,其中只有 game、get_in、get_out 将作为列? 我是否需要加入或联合,查询将如何?

使用条件聚合:

SELECT 
  SUM(CASE WHEN a.state = 'bet' THEN a.wert END) as get_in, 
  SUM(CASE WHEN a.state = 'win' THEN a.wert END) as get_out, 
  a.game 
FROM gamelogs a 
WHERE a.game IN (...) AND MONTH(a.date) = '3' AND YEAR(a.date) = '2020' 
GROUP BY a.game;

如果您不想在结果中使用null s,请使用coalesce()来获得0 s,例如:

COALESCE(SUM(CASE WHEN a.state = 'bet' THEN a.wert END), 0)

或者:

SUM(CASE WHEN a.state = 'bet' THEN a.wert ELSE 0 END)

我们可以做条件聚合。

此外,我会避免将 YEAR() 和 MONTH() 函数中的date列包装在谓词中……这会强制 MySQL 评估这些日期表达式。 当合适的索引可用时,引用裸列允许 MySQL 有效地使用范围扫描操作。

SELECT SUM(IF(a.state= 'bet' ,a.wert,NULL)) AS get_in
     , SUM(IF(a.state= 'win' ,a.wert,NULL)) AS get_out
     , a.game 
  FROM gamelogs a 
 WHERE a.state IN ('bet','win')
   AND a.game IN (31906,3300223,125140,7119,7130,1210,1141,7350,40002992,400030,40002994,7210,7353,3300099,7378,4000285,4000299,4000297,40002871,40002869,7229,40002867,7114,4000282,4000280,4000275,7093,4000273,4000270,7144,4000266,4000261,4000252,3300248,3300229,7087,102001,7123,3300095,7389,7384,7340,7356,7213,7079,7376,7360,7162,7161,7158,7157,7152,102010,7237,7305,7143,125112,7142,7139,7346,7137,7367,7132,7131,125126,6993,102014,7127,3300210,7124,7122,125134,7362,7354,3300142,7118,7117,125116,7234,7112,7110,7109,3300195,7106,7348,7364,7399,7374,7101,6998,7098,7225,7306,7368,7370,6996,7015,102000,3300134,7238,3100009,7381,1339,170133,3300239,1315,1358,1459,1522,1600,400031674,76000,7400,7242,400034,400032,400029846,400031677,4000295,400036,4000305,31910,319011,4000302,31915,319015,31919,31917,40002302,31921,7413,319017,319019,31955,31957,31923,31926,31908)
   AND a.date >= '2020-03-01' 
   AND a.date <  '2020-03-01' + INTERVAL 1 MONTH
 GROUP
    BY a.game

请注意,这有可能返回 get_in 和/或 get_out 的值,即两个单独查询未返回的行。 (考虑示例游戏 = 31906 没有“获胜”行......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM