首页 > 解决方案 > Mysql按列分组并最好在另一列值上获取最大ID

问题描述

我有一张包含这样内容的表格;

id      customer  is_default
1606384 5828      1
1573786 5828      0
1575316 5828      0
1817769 5828      0

对于这个客户,有一个is_default=1地址,但其他一些则没有。例如;

id      customer  is_default
1806384 5829      0
1873786 5829      0
1875316 5829      0
1917769 5829      0

我想获得MAX(id)但查询应该首先首选is_default= 1

例如,在第一个表中查询必须返回MAX(id) = 1606384,第二个表应该返回MAX(id) = 1917769

我无法解决这个问题。

你们能帮帮我吗?

编辑 1

回应@Strawberry 的评论

我试过这种方法;

首先,我将is_defaultid和 order 相乘,以便从查询中获取最大 id。但这一切都是错误的,因为我现在明白了

    SELECT MAX(id) as mid,MAX(is_default)
    FROM (
        (SELECT rel.maxid as id,customer,is_default FROM (
select (id+(is_default*10000000)) as maxid,customer,is_default FROM customer_address ORDER BY is_default DESC) rel ORDER BY maxid)
             ) rel
    GROUP BY customer

标签: mysqlgroup-by

解决方案


DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
(id SERIAL PRIMARY KEY
,customer INT NOT NULL
,is_default TINYINT NOT NULL
);

INSERT INTO my_table VALUES
(1606384,5828,1),
(1573786,5828,0),
(1575316,5828,0),
(1817769,5828,0),
(1806384,5829,0),
(1873786,5829,0),
(1875316,5829,0),
(1917769,5829,0);

SELECT x.customer
     , COALESCE(MAX(y.id),MAX(x.id)) id 
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.customer = x.customer 
   AND y.is_default = 1 
 GROUP 
    BY x.customer;
+----------+---------+
| customer | id      |
+----------+---------+
|     5828 | 1606384 |
|     5829 | 1917769 |
+----------+---------+

推荐阅读