2015-11-17 17 views
8

Ciao ragazzi io sono confuso con una cosaOrdina per rand() in yii2

Voglio scrivere query seguente in yii2 ma io non sono in grado di ottenere i risultati attesi

SELECT * FROM user where category_id=5 ORDER BY rand() LIMIT 4 

per questo ho hanno fatto seguito

$data= User::find()->where(['category_id'=> 5])->orderBy(['rand()'])->limit(4); 

ma genera il comando come segue

SELECT * FROM `user` WHERE `category_id`=5 ORDER BY `0` LIMIT 4 

Quale non è un'istruzione mysql valida, quindi cosa dovrei fare per ottenere la query giusta?

Il mio obiettivo è ottenere 4 record casuali dalla tabella user.

+1

A meno che non non preoccuparti delle prestazioni, mai ordinare da 'rand()'. È [terribilmente inefficiente] (https://www.warpconduit.net/2011/03/23/selecting-a-random-record-using-mysql-benchmark-results/). – Beowulfenator

+0

@Beowulfenator capito grazie. Ho usato il metodo nella conclusione su quell'articolo. –

+0

Leggi l'articolo. Ci sono diverse soluzioni lì e un grafico che mostra come si comportano su diversi set di dati. Non è rilevante quanti record devi trovare, è più importante quante voci totali hai nella tabella. – Beowulfenator

risposta

16

avvolgerlo in yii\db\Expression per prevenire la fuga e rimuovere gamma parte:

use yii\db\Expression; 

... 

$query = User::find() 
    ->where(['category_id' => 5]) 
    ->orderBy(new Expression('rand()')) 
    ->limit(4); 
+0

questo è bello. Funziona perfettamente. E puoi aiutarmi con il 'Limit' che non funziona nella parte' ActiveDataProvider'? cosa sto facendo di sbagliato lì? –

+0

Questa è una domanda diversa, il problema attuale è risolto. – arogachev

+1

per limit @arogachev fornire una risposta ad un'altra domanda questo è il collegamento [collegamento] (http://stackoverflow.com/questions/33748211/limit-is-not-working-in-activedataprovider) –

4

io non sono davvero un esperto di generatore di query yii2, tuttavia, specificare l'ordinamento dovrebbe aiutare

$data= User::find()->where(['category_id'=> 5])->orderBy(['rand()' => SORT_DESC])->limit(4); 
+0

spot on. Questo era il problema, ma il 'limite' non funziona in' ActiveDataProvider'. qualche idea? –

+0

imposta semplicemente l'impaginazione su falso e quindi l'impostazione manuale del limite funzionerà –