php - 如何使用 Group By 组合这两个 MySQL 查询

标签 php mysql sql database-design

我有这个表,用于通过station_id分组进行查询。

+------------------+---------------+------+-----+---------+-------+
| Field            | Type          | Null | Key | Default | Extra |
+------------------+---------------+------+-----+---------+-------+
| id               | varchar(50)   | NO   | PRI | NULL    |       |
| station_id       | tinyint(3)    | NO   |     | NULL    |       |
| game_type_id     | smallint(1)   | NO   | MUL | NULL    |       |
| price            | decimal(10,2) | YES  |     | 0.00    |       |
| date_created     | datetime      | YES  | MUL | NULL    |       |
| bet_no1          | tinyint(2)    | YES  |     | 0       |       |
| bet_no2          | tinyint(2)    | YES  |     | 0       |       |
+------------------+---------------+------+-----+---------+-------+

这是我用来使用GROUP BY station_id将其显示在表格上的查询

SELECT station_id,
COUNT(*) as bet_counts,
FORMAT(SUM(price),2) as gross
FROM bets 
WHERE bet_void=0 
AND date_created >= '2013-02-12 00:00:00' 
AND date_created < '2013-02-23 00:00:00' 
GROUP BY station_id

查询会给我。

+------------+------------+-------+
| station_id | bet_counts | gross |
+------------+------------+-------+
|          1 |         14 | 16.00 |
|          2 |          5 | 5.00  |
|          7 |         11 | 11.00 |
+------------+------------+-------+

但我还有另一个查询,用于计算每个 station_id 的每个特定投注( game_type_id )。我通常在循环语句中查询这个。

SELECT COUNT(*) as count
FROM bets
WHERE game_type_id = 1
AND station_id = {station_id from first query}
AND date_created >= '2013-02-12 00:00:00'
AND date_created < '2013-02-23 00:00:00'

我的问题是,如何在一个查询中执行此操作,同时仍然使用 GROUP BY station_id 并获取每个 game_type_id 的投注计数?类似这样的结果。

+------------+------------+-------+-------------------------+-------------------------+
| station_id | bet_counts | gross | count_of_game_type_id_1 | count_of_game_type_id_2 |
+------------+------------+-------+-------------------------+-------------------------+
|          1 |         14 | 16.00 |                      10 |                       4 |
|          2 |          5 | 5.00  |                       3 |                       2 |
|          7 |         11 | 11.00 |                      11 |                       0 |
+------------+------------+-------+-------------------------+-------------------------+

最佳答案

您可以通过将结果连接在一起来完成此操作。但是,这两个查询的逻辑非常相似,因此您可以将它们组合成一个聚合查询:

SELECT station_id,sum(case when bet_void = 0 then 1 else 0 end) as bet_counts,
       FORMAT(SUM(case when bet_void = 0 then price else 0 end),2) as gross,
       sum(case when game_type_id = 1 then 1 else 0 end) as count
FROM bets b
where date_created >= '2013-02-12 00:00:00' AND date_created < '2013-02-23 00:00:00'
GROUP BY station_id

关于php - 如何使用 Group By 组合这两个 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15016214/

相关文章:

php - MySQL:获取一个时间范围内存在的结果,但不存在另一时间范围内的结果

sql - 如何在 Postgres 的窗口函数中获取 mode()?

sql - 衡量 SQL 语句的复杂性

php - PDO 无法访问数据库连接实例

php - 无法提交到数据库

php - 如何使用 Zend Framework2 修复此查询

sql - 如何使用 oracle 中现有帐户的相同权限复制模式?

javascript - 如何显示每 10 秒更改一次的横幅并遵守页面刷新的时间段?

php - 每周从多个表中获取唯一数据

php - 使用 where in 条件从表中获取最新的 N 条记录