Saya mengerti bahwa Anda dapat menentukan -> berbeda () pada pernyataan db_select sehingga hanya mengembalikan nilai yang berbeda ketika melihat SEMUA bidang. Tapi yang saya inginkan adalah mengembalikan nilai yang berbeda dengan hanya melihat SATU bidang. Ini kode saya:
$event_table = db_select('my_table', 'e')
->distinct()
->orderBy('e.time', 'ASC');//ORDER BY
$event_table->join('node', 'n', 'e.nid = n.nid'); //JOIN node with events
$event_table->groupBy('e.time');//GROUP BY time
$event_table->fields('e')//SELECT the fields from events
->fields('n',array('type','status','title'))//SELECT the fields from node
->orderBy('e.time', 'ASC');//ORDER BY
$result_event_table = $event_table->execute();
$result_event_table = $result_event_table->fetchAllAssoc('time');
Misalkan saya ingin kolom yang berbeda menjadi e.nid. Anda akan berpikir -> berbeda ('e.nid') akan berfungsi tetapi masih mengembalikan nilai berbeda berdasarkan semua bidang (yaitu berbeda (kolom1, kolom2, kolom3, dll).
db_select
melakukan hal yang samaJawaban:
Dengan asumsi Anda mencoba untuk mendapatkan kira-kira permintaan ini:
Anda akan menggunakan:
sumber
DISTINCT sebenarnya adalah post-modifier global untuk SELECT, yaitu, sebagai lawan dari SELECT ALL (mengembalikan semua jawaban) itu SELECT DISTINCT (mengembalikan semua jawaban unik). Jadi satu PERBEDAAN bertindak pada SEMUA kolom yang Anda berikan.
Ini membuatnya sangat sulit untuk menggunakan DISTINCT pada satu kolom, sambil mendapatkan kolom lainnya, tanpa melakukan backflip besar yang sangat jelek.
Jawaban yang benar adalah dengan menggunakan GROUP BY pada kolom yang Anda ingin memiliki jawaban unik:
sumber
COUNT(DISTINCT foo)
tetapi itupun merupakan pengubah fungsi agregator.Hapus
->distinct()
dan ganti dengan$event_table->AddExpression('distinct e.nid', 'nid');
Seperti itu:
sumber
Jika Anda menggunakan kueri ini, itu menyediakan kueri berbeda yang tepat.
sumber