[英]Mysql group by column and get max id preferably on another column value
我有一張表格,內容是這樣的;
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
我無法解決這個問題。
你們能幫幫我嗎?
回應@Strawberry 的評論
我試過這種方法;
首先,我將is_default與id和 order by 相乘,以便從查詢中獲取最大 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
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 |
+----------+---------+
您可以執行以下操作,但@Strawberry 的答案似乎更好:
SELECT
customer,
(CASE WHEN is_default IS NOT NULL THEN is_default ELSE nis_default END) AS max
FROM (
SELECT
customer,
MAX(CASE WHEN is_default = 1 THEN id END) AS is_default,
MAX(CASE WHEN is_default = 0 THEN id END) AS nis_default
FROM t
GROUP BY customer) T
編輯:我的查詢可以用 COALESCE 簡化,如下所示:
SELECT
customer,
COALESCE(
MAX(CASE WHEN is_default = 1 THEN id END),
MAX(CASE WHEN is_default = 0 THEN id END)) AS max
FROM t
GROUP BY customer
如果您只想要單個 max(id) 值,最好使用 is_default=1,然后使用:
select max_id
from (
select is_default, max(id) as max_id
from customer_address
group by is_default
order by is_default desc
limit 1
) as q;
你需要一個 CASE 表達式:
select
customer,
case max(is_default)
when 1 then max(is_default * id)
else max(id)
end maxid
from tablename
group by customer
請參閱演示。
結果:
| customer | maxid |
| -------- | ------- |
| 5828 | 1606384 |
| 5829 | 1917769 |
select MAX(ID),(select MAX(ID) from table where is_default = 0)
from table
where is_default = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.