mysql - 具有多个条件的 SQL group by

标签 mysql sql greatest-n-per-group

我正在处理访客日志数据,需要按 IP 地址对其进行汇总。数据如下所示:

id        | ip_address     | type     | message  | ...
----------+----------------+----------+----------------
1         | 1.2.3.4        | purchase | ...
2         | 1.2.3.4        | visit    | ...
3         | 3.3.3.3        | visit    | ...
4         | 3.3.3.3        | purchase | ...
5         | 4.4.4.4        | visit    | ...
6         | 4.4.4.4        | visit    | ...

And should summarize with:

type="purchase" DESC, type="visit" DESC, id DESC

产量:

chosenid  | ip_address     | type     | message  | ...
----------+----------------+----------+----------------
1         | 1.2.3.4        | purchase | ...
4         | 3.3.3.3        | purchase | ...
6         | 4.4.4.4        | visit    | ...

是否有一种优雅的方式来获取这些数据?


下面是一个丑陋的方法:

set @row_num = 0; 
CREATE TEMPORARY TABLE IF NOT EXISTS tt AS 
SELECT *,@row_num:=@row_num+1 as row_index FROM log ORDER BY type="purchase" DESC, type="visit" DESC, id DESC
ORDER BY rating desc;

然后获取每个ip_address的最小row_index和id (https://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column)

然后将这些id连接回原表

最佳答案

我认为这应该是您需要的:

SELECT yourtable.*
FROM
  yourtable INNER JOIN (
    SELECT   ip_address,
             MAX(CASE WHEN type='purchase' THEN id END) max_purchase,
             MAX(CASE WHEN type='visit' THEN id END) max_visit
    FROM     yourtable
    GROUP BY ip_address) m
  ON yourtable.id = COALESCE(max_purchase, max_visit)

请参阅 fiddle here .

我的子查询将返回最大购买 ID(如果没有购买则返回 null)和最大访问 ID。然后我用 COALESCE 连接表,如果 max_purchase 不为空,连接将在 max_purchase 上,否则它将在 max_visit 上。

关于mysql - 具有多个条件的 SQL group by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740183/

相关文章:

sql - ActiveRecord 嵌套 SELECT——我可以在没有手动 SQL 的情况下完成吗?

mysql - 需要按类别选择5条最新记录?

mysql - 使用分页的内连接限制 1

mysql - Moodle SQL 查询检索过去 90 天内注册类(class)的所有用户

java - 如何在 Group by 子句中使用 SQL Case?

mysql - 仅检索关节具有依赖性的行

mysql - 使用 SQL 在 Magento 中检索产品详细信息

php - 从多个本地数据库更新服务器上的数据库

下拉发布请求时出现 PHP "Undefined index:"错误

mysql - 将日期转换为 dd-mm-yy 格式并从 SQL 2008 中选取的值中选择最后 12 个日期