Bir sütun adına göre sıralanır MySQL rastgele satırlar

4 Cevap php

Original Question:

Şu anda Zend_Db_* ile Zend Framework kullanıyorum, ve ben bir tablodan rasgele üç satır seçiyorum:

$category->getTable()->select()->order(new Zend_Db_Expr('RAND()'))->limit('3')

$category a Zend_Db_Table_Row olduğu. Ben rasgele üç satır kapmak istiyorum, ama name adlı sütunun tarafından sipariş bu üç satır olurdu.

Hiçbir etki aşağıdakilere ->order() vardı değiştirme:

->order(array(new Zend_Db_Expr('RAND()'), 'name ASC'))

Kayıtlar hala gösteriyor gibi un-sipariş ve yine rastgele.

Zend Framework çözümleri takdir, ama benim proje sığdırmak için başka çözümler uyarlayabilirsiniz.


Bu bir sorun haline için ben RAND () kullanarak ölçekleme sorunların farkındayım, veritabanı yeterince büyük olsun asla, öyle bir gün bunu sürdürmek konusunda endişelenmenize gerek olmayacaktır, robotlar olacak, ben olacak uzun ölmüş! :-P


Answer

Bu sonuçta Zend_Db_Select kullanılarak tamamlanmıştır nasıl merak edenler için, bu (Ben bağımlı satır kümesi bulmak için $category->findDefault_Model_projects() kullanan Zend_Db_Select içinde bir sub-select kullanmak için aşağı geldi ne, ama bana izin vermiyor ZF-6461 sorunu giderir kadar subselect olarak () seçeneğini kullanın, ben) ne ile şaşırıp:

$projects = new Default_Model_Projects();
$subselect = $projects->select()->order(new Zend_Db_Expr('RAND()'))->limit('3')->where('cid = ?', $category->id, Zend_Db::INT_TYPE);
$db = $projects->getAdapter();
$select = $db->select()->from(array("c" => new Zend_Db_Expr("({$subselect})")))->order('name');

$stmt = $select->query();
$projects = $stmt->fetchAll();

Oluşturulan SQL olduğunu:

SELECT `c`.* FROM (SELECT `projects`.* FROM `projects` WHERE (cid = 1) ORDER BY RAND() LIMIT 3) AS `c` ORDER BY `name` ASC

Oradan $ projeler üzerinde çok başka bir veritabanı sorgularını gibi, bunu yapmaz tek şey onun olumsuz yanları var olabilecek bir tablo belirli satır / satır sınıfında, sopa olduğunu iterated standart satır kümesi içerir.

4 Cevap

Bu sorgu rastgele değerler (yüksek ihtimal olan) eşit yalnızca ada göre sıralama, her satır için rasgele bir değer ve düzen buna dayalı satır üretecektir çünkü sizin ilk çözüm doğru değil.

Sorun aşağıdaki gibi bir alt sorgu ile çözülebilir

select * from (select * from categories order by rand() limit 3) c order by name

Sana Zend_Db dile Bu çeviri görevi bırakıyorum.

$subQuery = $this->select()->from('picture')->order(new Zend_Db_Expr('RAND()'))->limit(count($this->selectAll()));
$select->setIntegrityCheck(false)
       ->from($subQuery);

Bu ne yaptım ve çalışıyor. Şerefe!

Neden sadece adıyla verileri sıralar bir satır kümesi Sınıfı işlevi oluşturmak değil mi?

Bu deneyin:

$select = $this->select();
$select->order('RAND(), name');
$select->limit(3);
return $this->fetchAll($select);

Çok, sizin için çalışması gerektiğini, böylece burada benim için çalışıyor.