如題,如果mysql資料庫中有一個表table,欄位分別有a、b、c、d,想根據欄位a分組,然后顯示每組的第一條,sql陳述句格式為:select a,MIN(b),c,d from table group by a。
在sql查詢的結果集中,b欄位可以取到最小值,那么c和d欄位是取?
資料內容
a b c d
1 1 1 1
1 2 2 2
1 3 3 3
以上資料內容從mysql資料庫直接查詢,結果集為:1、1、1、1,但是從代碼里查詢,回傳的結果集是:1,1,3,3。
求大神解惑!!!
uj5u.com熱心網友回復:
select a,MIN(b),MIN(c),MIN(d) from table group by auj5u.com熱心網友回復:
按照group by上一個程序的得到的結果集中的第一行。這個第一行是按照物理存盤順序的第一行,是隨機不可預測的。當資料group by后,背景關系會切換為每個組而不再是每行。因此,標準SQL中,select欄位串列中無法使用非分組欄位,因為違反了關系模型的范式。
在mysql中,對標準SQL的GROUP BY進行了擴展(換句話說,違反了關系模型的范式),select欄位串列中可以使用非分組欄位。
http://www.cnblogs.com/f-ck-need-u/p/8656828.html
uj5u.com熱心網友回復:
謝謝回答,但是這個不對,其他欄位不一定是最大或最小值,也不能使用其他聚合函式
uj5u.com熱心網友回復:
謝謝回答,按文中的意思,雖然mysql對group by進行了擴展,但是不按sql規范寫的sql陳述句執行的結果是不可預知,隨機的,所以最好還是按照sql規范寫陳述句,是這樣吧?
uj5u.com熱心網友回復:
如果你想按照標準SQL來理解,自然更好(這也表示同時理解了SQL SERVER,ORACLE的SQL語法,因為它們在SQL規范化上嚴格遵守SQL標準)。但SQL規范既然是為了標準而定的,自然是可以違反的,畢竟MySQL也有它自己的"個性"。只要你知道這么做對你的需求不造成影響(特別是增刪改陳述句),那就無所謂啊。
uj5u.com熱心網友回復:
SELECT a,b,c,d FROM TABLE WHERE (a,CONCAT(b,c,d)) IN (SELECT a,MIN(CONCAT(b,c,d)) bcd FROM TABLE GROUP BY a)轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/90985.html
標籤:MySQL
上一篇:mysql觸發器新建表
