2013-03-07 56 views
0
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` 

我該如何獲得id對於保存MAX(`client_id`)值的行?如何返回組中具有MIN/MAX值的行的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`; 
+0

每組如上所述還是最大週期? – 2013-03-07 18:55:46

+0

你真的想做'language_id = 1 AND client_id = 1 OR client_id'是NULL'而不是'language_id = 1 AND(client_id = 1 OR client_id' IS NULL)'? – Lamak 2013-03-07 18:55:48

+0

以下是上下文,http://sqlfiddle.com/#!2/0fd79/1。 – Gajus 2013-03-07 18:56:00

回答

0

我有一點很難理解的要求,但是這似乎是你在找什麼。
不是最美麗的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 

An SQLfiddle for testing

0

使用窗口函數查找每個組最大,然後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聲明。當混合andor時,我總是使用括號來避免可能的混淆和錯誤。

現在您已將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 

注意這一點,如果id將轉換爲:在這個過程中的字符串。如果它有不同的類型,則可以將其轉換回來。

相關問題