[英]How to return an ID for the row that has MIN/MAX value within a group?
SELECT
MAX(`client_id`) `client_id`
FROM
`phrases`
WHERE
`language_id` = 1 AND
`client_id` = 1 OR
`client_id` IS NULL
GROUP BY
`language_phrase_id`
如何獲取包含MAX(`client_id`)
值的行的id
?
我需要在派生表的上下文中,例如
SELECT
`p2`.`phrase`
FROM
(SELECT `language_phrase_id`, MAX(`client_id`) `client_id` FROM `phrases` WHERE `language_id` = 1 AND `client_id` = 1 OR `client_id` IS NULL GROUP BY `language_phrase_id`) `p1`
INNER JOIN
`phrases` `p2`
ON
`p2`.`language_id` = 1 AND
`p1`.`language_phrase_id` = `p2`.`language_phrase_id` AND
`p1`.`client_id` = `p2`.`client_id`;
我在理解需求時遇到了一些麻煩,但這似乎正是您要尋找的。
不是最漂亮的SQL,我敢肯定它可以簡化,而是一個起點。
SELECT p1.id, p1.phrase
FROM phrases p1
LEFT JOIN `phrases` p2
ON p1.language_id=p2.language_id
AND p1.language_phrase_id=p2.language_phrase_id
AND p1.client_id IS NULL and p2.client_id = 1
WHERE p2.id IS NULL AND p1.language_id=1
AND (p1.client_id=1 or p1.client_id IS NULL)
GROUP BY p1.language_phrase_id
使用窗口函數查找每個組的最大值,然后使用where
子句選擇具有最大值的行:
select p.*
from (SELECT p.*, max(client_id) partition by (language_phrase_id) as maxci
from phrases p
WHERE (`language_id` = 1 AND `client_id`= 1) or
`client_id` IS NULL
) p
where client_id = maxci
我還添加了括號以闡明您的where
語句。 混合and
和or
,我總是使用括號以避免可能出現的混亂和錯誤。
現在,您已將mysql
標記添加到語句中,這將不起作用。 因此,這是一個特定於MySQL的解決方案:
select language_phrase_id,
substring_index(group_concat(id order by client_id desc), ',', 1) as max_id
from phrases
group by phrases p
請注意,此if id
將在此過程中轉換為字符串。 如果類型不同,則可以將其轉換回來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.