MySQL选择性GROUP BY,使用最大值

标签 mysql sql

我有以下(简化的)三个表格:

用户预订:

id | user_id |
 1 | 3       |
 1 | 3       |

用户_kar:

id | user_id | szak_id |
 1 | 3       | 1       |
 2 | 3       | 2       |

萨克:

id | name |
 1 | A    |
 2 | B    |

现在我想通过“szak”名称来计算用户的预订,但我希望每个用户仅计算一个 szak。在本例中,user_id 有 2 个“szak”,如果我编写如下查询:

SELECT sz.name, COUNT(*) FROM user_reservations r 
   LEFT JOIN user_kar k ON k.user_id = r.user_id
   LEFT JOIN szak s ON r.szak_id = r.id

它将返回两行:

A | 2 |
B | 2 |

但是,我希望每个预订仅计为一个 szak(仅假设最高的 id)。我尝试了 MAX(k.id) 和 HAVING,但似乎没有效果。

我想知道MySQL中是否有支持的方法,或者我应该首先选择后端站点上的所有用户ID,检查它们的最大kar.user_id,然后仅对这些进行计数,当计算给定的 szak 时,将它们从 id 列表中删除,然后在后端将数据重新构建在一起?

感谢您的帮助 - 我在谷歌上搜索了大约 2 个小时,但到目前为止,我没有找到解决方案,所以也许您可以帮助我。

最佳答案

类似这样的吗?

SELECT sz.name, 
       Count(*) 
FROM   (SELECT r.user_id, 
               Ifnull(Max(k.szak_id), -1) AS max_szak_id 
        FROM   user_reservations r 
               LEFT OUTER JOIN user_kar k 
                            ON k.user_id = r.user_id 
        GROUP  BY r.user_id) t 
       LEFT OUTER JOIN szak sz 
                    ON sz.id = t.max_szak_id 
GROUP  BY sz.name; 

关于MySQL选择性GROUP BY,使用最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21425516/

相关文章:

mysql - MySQL会根据多列索引顺序重新排序where条件吗?

php - 发布到表时清除用户输入数据的空白

sql - 这个 SQL 语句是否容易受到 SQL 注入(inject)攻击?

mysql - 根据列与另一列的关系获取 SUM (SQL)

mysql - 当在 master 中插入行时 SQL 在相关中插入行

MySql:如果用户具有特定角色则排除用户

mysql - 使用具有不同随机子查询结果的 GroupBy 随机化 MySQL 中的 Select SubQuery

sql - 如何在 SQL 中以 0.25 增量执行自定义回合?

mysql - PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 等价物是什么

php - 从 URL 中的 $_GET 检索变量时 undefined index