web-dev-qa-db-ja.com

Drupal 7の特定のフィールドでDISTINCTをdb_selectする方法は?

すべてのフィールドを調べたときに明確な値のみが返されるように、db_selectステートメントで-> distinct()を指定できることを理解しています。しかし、私が望んでいるのは、1つのフィールドだけを見て、明確な値を返すことです。これが私のコードです:

$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');

個別の列をe.nidにしたいとします。 -> distinct( 'e.nid')は機能すると思いますが、すべてのフィールドに基づいて個別の値を返します(つまり、distinct(columns1、column2、column3など)。

7
CHRIS

おおよそこのクエリに到達しようとしていると仮定します。

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

あなたは使うでしょう:

$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');
12
Clive

DISTINCTは、実際にはSELECTのグローバルなポスト修飾子です。つまり、SELECT ALL(すべての回答を返す)とは対照的に、SELECT DISTINCT(すべての一意の回答を返す)です。したがって、1つのDISTINCTが、指定したすべての列に作用します。

これにより、1つの列でDISTINCTを使用し、他の列を取得して、非常に醜い大きなバク転を行わないようにするのは非常に困難になります。

正解は、一意の回答を取得する列でGROUP BYを使用することです。

7
TBI Infotech

->distinct()を削除し、$event_table->AddExpression('distinct e.nid', 'nid');に置き換えます

そのようです:

$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');
2
Scott Joudry