Bagaimana cara db_seleksi DISTINCT pada bidang tertentu di Drupal 7?


7

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).


1
Apakah ada kemungkinan Anda bisa memberikan sampel dari output SQL yang Anda cari? Itu akan membuatnya cukup mudah untuk mengetahui cara membujuk db_selectmelakukan hal yang sama
Clive

Jawaban:


12

Dengan asumsi Anda mencoba untuk mendapatkan kira-kira permintaan ini:

SELECT DISTINCT e.nid AS nid, e.time AS time, n.type AS type, n.status AS status, n.title AS title
FROM 
{my_table} e
INNER JOIN {node} n ON n.nid = e.nid
GROUP BY e.time
ORDER BY e.time ASC

Anda akan menggunakan:

$query = db_select('my_table', 'e')
  ->distinct()
  ->fields('e', array('nid', 'time', 'foo', 'bar'))
  ->fields('n', array('type', 'status', 'title'))
  ->groupBy('e.time')
  ->orderBy('e.time');

$query->join('node', 'n', 'n.nid = e.nid');

Ini hanya memberi saya semua bidang yang berbeda, bukan hanya dan tidak menjadi berbeda
CHRIS

Saya tidak yakin apa yang Anda maksud, pertanyaan di atas adalah pertanyaan yang berbeda ... SQL apa yang Anda coba hasilkan?
Clive

1
misalkan ada '4' '4' '5' '5' di kolom nid dengan kolom yang sesuai bernama 'type' dengan 'a' 'b' 'c' 'd'. baik, jika saya memilih yang berbeda pada kedua kolom (nid, ketik), hasilnya akan memiliki 4 baris. tetapi jika saya memilih berbeda pada HANYA nid, hasilnya akan memiliki 2 baris. Saya mencoba untuk memilih berbeda pada JUST nid
CHRIS

2
Saya pikir Anda salah paham bagaimana pengelompokan bekerja dalam SQL ... untuk melakukan apa yang Anda gambarkan Anda harus menghapus kolom jenis dari bidang yang dipilih
Clive

7

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:


Persis. Itu sebabnya DBTNG memilikinya di tingkat permintaan. Satu-satunya saat DISTINCT adalah level kolom (atau samar-samar terlihat seperti itu) adalah ketika Anda melakukannya COUNT(DISTINCT foo)tetapi itupun merupakan pengubah fungsi agregator.

2

Hapus ->distinct()dan ganti dengan$event_table->AddExpression('distinct e.nid', 'nid');

Seperti itu:

$event_table = db_select('my_table', 'e');
$event_table->AddExpression('distinct e.nid', 'nid')
$event_table->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

// you need to outline all fields here, can't use e.*
$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');

PDOException: SQLSTATE [42000]: Kesalahan sintaksis atau pelanggaran akses: 1064 Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'e.nid berbeda SEBAGAI nid DARI mcc_notify_event_queue e INNER GABUNG node N ON e.nid' pada baris 1: SELECT e. *, n.type AS type , status status AS n.status, Judul AS judul, berbeda e.nid AS pembantu DARI {mcc_notify_event_queue} e INNER JOIN {node} n ON e.nid = n.nid KELOMPOK OLEH e.time ORDER BY e.time ASC; Array ()
CHRIS

tidak dapat menggunakan e. * dan e.nid yang berbeda, melempar kesalahan. Anda harus menulis bidang Anda seperti yang saya catat di atas.
Scott Joudry

Saya masih mendapatkan kesalahan. Yang saya lakukan hanyalah mengubah kode Anda menjadi $ event_table-> bidang ('e', array ('nid', 'time', 'event_type')) // PILIH bidang dari acara
CHRIS

Anda masih memilih nid dua kali dalam kasus yang menjelaskan kesalahan. Coba $ event_table-> bidang ('e', array ('waktu', 'event_type'))
Scott Joudry

masih kesalahan berbeda e.nid AS nid DARI my_module_event_queue e INNER JOIN node n ON e.nid 'at line 1: SELECT e.time AS time, e.event_type AS event_type, n.type AS type, n.status status AS, n.title AS title, berbeda e.nid AS nid DARI {my_module_event_queue} e INNER JOIN {node} n ON e.nid = n.nid KELOMPOK OLEH e.time ORDER OLEH e.time ASC;
CHRIS

-1

Jika Anda menggunakan kueri ini, itu menyediakan kueri berbeda yang tepat.

<?php  

$select = db_select('service_payment_transaction','o');
$select->distinct('o.transaction_id');
$select->innerJoin('users', 'u', 'u.uid = o.user_id');
$select->fields('o');
$select->fields('u');
$select->condition('o.service_gv_code','','!=');
$select->range($start,$page_count);
$select->groupBy('o.service_gv_code');
$select->orderBy('transaction_id', 'DESC');
$result_query = $select->execute();

1
Fungsi yang berbeda mengambil boolean sebagai argumennya, bukan string.
Felix Eve
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.