2011-09-21 46 views
0

下面是示例數據集,我有:如何在GROUP保持一個重要的列值BY

id | messageread | timestamp 
1 |  'yes' |  999 
1 |  'yes' |   0 
1 |  'no' |   0 

我這樣做:

SELECT * 
FROM nvm 
GROUP BY id 

你會注意到,該數據集已經是ORDER BY timestamp DESC

因爲它應該,MySQL正在返回第一行。

我會想什麼是MySQL的返回的第一行,但messageread='no' IF在分組的行之一messageread='no',不管是否正常返回行是'yes''no'

可能與MySQL的?我答應自己儘可能地使用MySQL而不是PHP :-)謝謝!

+0

你「因爲它應該」不能保證。 [服務器可以自由選擇每組中的任何值,因此除非它們相同,否則所選的值是不確定的。](http://dev.mysql.com/doc/refman/5.6/en/group-by- hidden-columns.html) –

+0

「通常情況下」,如果你願意,但那不是重點。無論如何,感謝您指出。 – Pioul

回答

0

爲了確保所有行都來自同一列做:

SELECT * FROM table1 t1 
LEFT JOIN table1 t2 ON ((t1.messageread, t1.id) < (t2.messageread, t2.id)) 
WHERE T2.ID IS NULL 

這將選擇從表1的最小或最大行。所有的列將來自同一行。
如果它不起作用,您需要將<更改爲>這裏已經晚了,我無法測試該查詢,但它應該完成這項工作。

警告,反模式領先
這有臭雞蛋都在它的氣味,但如果你想混合和匹配快速做:

SELECT id, min(messageread), timestamp as random_timestamp 
FROM table1 
GROUP BY id 
+0

「所有列都來自同一行」,你把它整理好了,那不是我想要的:/它已經返回同一行的所有列,而這一行是最好的列。我只想讓一列取得一個特定的值,而不管所選行的colmun值如果在任何其他行中遇到這個值。@Dave提出了一個很好的建議,但在我的情況下使用太重了,我正在尋找一些更簡單的方法 – Pioul

+0

@pioul,你問的。 – Johan

+0

我喜歡它,上帝保佑ROTTEN EGGS!如果有更清晰的方式,我都在聽,但那會在那之前。謝謝,親愛的救世主! – Pioul

0

你需要做一個CASE語句和ANY一起。

SELECT 
    CASE WHEN 'no' = ANY(SELECT messageread FROM nvm t2 WHEN t2.id = t1.id) 
     THEN 'no' 
     ELSE 'yes' 
     AS messageread, 
    timestamp, 
FROM nvm t1 
GROUP BY t1.id 

注意:你基本上在這裏得到一個隨機時間戳,你想要MAX(時間戳)或什麼?

+0

這裏的問題是'messageread'是在22行長的SQL查詢之後確定的,並且你的解決方案意味着運行兩次(如果我正確的話)。沒有任何「魔術」關鍵字可以告訴MySQL在分組時爲列保留一個值,如果它遇到它的話? (感謝你的答案,對於時間戳問題,我爲了簡單起見就這麼說了,但是在真正的查詢中已經考慮到了這一點) – Pioul

+0

不是100%確定的,但你可能希望嘗試返回true和false,或者1和0而不是和是,然後使用BIT_AND(http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_bit-and)。所以你''選擇BIT_AND(messageread)作爲messageread' – Dave

+0

'yes'和'no'是爲了讓它在文章中變得更簡單,但是我真的在這裏使用字符串,所以我猜測這是行不通的:/ – Pioul