2015-08-10 16 views
6

MySQL'in garip davranışlarıyla karşılaşıyorum. Ben onun hesaplamada() RAND kullanan bir alan seçmek ve bu alan tarafından sonuç sipariş, her şey iyi çalışır:MySQL SİPARİŞ BY rasgele alan ek işlemle çalışmaz

SELECT 
RAND() AS r 
FROM SomeTable 
ORDER BY r DESC; 

Ancak, ben + gibi ORDER BY deyimi içinde ek bir işlemi gerçekleştirmek, -, *./veya bir sabit ya da başka bir alan ile ne istersen, sonuç artık sıralanmaz. Örneğin: Elbette

SELECT 
RAND() AS r 
FROM SomeTable 
ORDER BY r+1 DESC; 

Ben ilave bir alanda çalışmasını taşıyabilir, ama ben yanlış bir şey yapmak ister sadece merak oldu. Bilinmeyen bir nedenden dolayı, MySQL'in ORDER BY deyiminde bir işlem yapıldığında alanı yeniden değerlendirdiğini varsayalım.

Bu doğru bir varsayım mıdır ???

+0

Bence bu bir MySQL hatasıdır. –

cevap

2

MySQL 5.0 Reference:

Sen ORDER BY RAND içeren bir sütun() değerleri kullanamaz, çünkü sütun birden çok kez değerlendireceklerini ORDER BY.

RAND()

bunu yeniden değerlendirilmesi alır r olarak başka ad ettik ve sütun olarak aynı değeri tutmaz rağmen denir her zaman değerlendirilmektedir.

Eğer ORDER BY r+1 bir alt sorgu gerekir istiyorsanız

:

SELECT * 
FROM (SELECT col1, RAND() AS r 
     FROM Table1 
    ) sub 
ORDER BY (r+1) DESC; 
+0

Referans için teşekkür ederiz. Yani, ayrıca (r + 1) ek sütun seçmemenizi mi tavsiye edersiniz? Test ettim ve gayet iyi çalışıyor. Yani bu durumda, birden çok kez değerlendirilmeyecek gibi görünüyor. – user1488793

+0

@ user1488793 Eğer RAND() + 1 AS r1 'SEÇEBİLİRSİNİZ sonra yeniden değerlendirme yapmadan r1'İ SİPARİŞ edebilirsiniz, her ikisine de' r 've' r + 1 'gerektiğini düşündüm. Eğer RAND() AS değerini seçerseniz, RAND() + 1 AS r1 '' r' ve r1 'arasındaki fark çok nadiren 1 olacaktır. –

+0

Denemeyi takdir ediyorum ama aslında bunun nasıl olduğunu göremiyorum. soru. OP, "sıralamasında" rand() 'a sahip değildir. OP, 'select' referanslı bir ifadeye sahiptir. –

0

sorunu gibi görünüyor diğer veritabanları "uçucu" işlevleri çağırmak ve MySQL "non-deterministik" işlevlerini adlandırdığı kaynaklandığı. Bunlar, her çağrıldığında farklı değerler döndüren işlevlerdir. r içinORDER BY takılı olan

olan
SELECT RAND() AS r 
FROM SomeTable 
ORDER BY RAND() + 1 DESC; 

, ifadesi: olarak gözleme dayanarak

, ikinci sorgulama değerlendirilmektedir. rand() deterministik olmadığı için, her çağrıldığında farklı bir değer döndürür. Sonuç rastgele sıralanmış bir sonuç kümesidir, ancak r sütununun siparişinden farklıdır.

Kanımca, bu bir MySQL hatasıdır. NOT DETERMINISTIC (veya en azından) bildirilen bir işlev için ifade değiştirmeyi kullanıyor. "Hata" basitçe, yerleşik rand() işlevinin not deterministic olarak doğru şekilde bildirilmemesi olabilir. Bildirimin göz ardı edilmesi olabilir. Açıkçası, MySQL, özellikle deterministik olmayan bir işlev için, ifadenin değil, takma adın başvurduğu değeri kullanmalıdır. Not: Bu, deterministik işlevlerin ötesinde bir potansiyel etkiye sahiptir. Not: Bu, deterministik işlevlerin ötesinde bir potansiyel etkiye sahiptir. İfade karmaşık, zaman alıcı bir ifade ise, order by için birden fazla ek kez değerlendirilmek üzere sonuçlanabilir.