2011-09-04 21 views
8

Aşağıdaki örnekte, min() sorgusu neden sonuç döndürüyor, ancak max() sorgusu yok mu?MySQL toplama işlevi sorunu

mysql> create table t(id int, a int); 
Query OK, 0 rows affected (0.10 sec) 

mysql> insert into t(id, a) values(1, 1); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into t(id, a) values(1, 2); 
Query OK, 1 row affected (0.02 sec) 

mysql> select * from t 
    -> ; 
+------+------+ 
| id | a | 
+------+------+ 
| 1 | 1 | 
| 1 | 2 | 
+------+------+ 
2 rows in set (0.00 sec) 

mysql> select * from t where a < 4; 
+------+------+ 
| id | a | 
+------+------+ 
| 1 | 1 | 
| 1 | 2 | 
+------+------+ 
2 rows in set (0.00 sec) 

mysql> select * from t where a < 4 having a = max(a); 
Empty set (0.00 sec) 

mysql> select * from t where a < 4 having a = min(a); 
+------+------+ 
| id | a | 
+------+------+ 
| 1 | 1 | 
+------+------+ 
1 row in set (0.00 sec) 
+2

Sorgu, diğer tüm RDBMS'lerde geçersizdir. Geri dönmesini ne bekliyorsunuz? –

cevap

7

HAVING yan tümcesi, satır gruplarını filtrelemek için kullanılır. min(a) ve max(a) referans numaralarını (GROUP BY yan tümcesi yokluğunda) tablodaki tüm a değerlerinde toplayın, ardından tek bir a değerine karşı bir karşılaştırma kullanın.

a değeri hangi MySQL kullanılmalı? Bildiğim diğer tüm RDBMS'ler bu noktada bir hata yapar ancak MySQL buna izin verir. From the docs

Standart SQL Bir toplama fonksiyonu içine sürece GROUP BY maddesi bulunmayan herhangi bir sütun isim HAVING maddesini izin vermez. MySQL, hesaplamalarını basitleştirmek için bu tür sütunların kullanılmasına izin verir. Bu uzantı, gruplanmamış sütunların 'un aynı grup değerlerine sahip olacağını varsayar. Aksi halde, sonuç belirsizdir.

Yani aldığınız sonuçlardan adresinin durumunda bunun a için skaler değer olarak 1 kullanarak sona erdi anlaşılmaktadır ancak bu davranışın garanti edilmez ve eşit derecede iyi kullanmış olabilir 2 veya a mevcut herhangi bir başka değer.

+0

Ve sonuçların belirsizliğini kanıtlamak için, 'a = 0' olan bir satır ekleyebilirsiniz. Şimdi her iki ifadeniz de satır döndürmeyecek. – NullUserException

+2

Bunu yapmanın doğru yolu, bir alt sorgunun kullanılmasıdır: 'select * t dan t = a ((min (a) t'yi seçin);' – NullUserException