Entendo que você pode especificar -> distinct () na instrução db_select para que ele retorne apenas valores distintos ao examinar TODOS os campos. Mas o que eu quero é retornar valores distintos apenas olhando para UM campo. Aqui está o meu código:
$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');
Suponha que eu queira que a coluna distinta seja e.nid. Você pensaria -> distinct ('e.nid') funcionaria, mas ainda retornaria valores distintos com base em todos os campos (ou seja, distintos (colunas1, coluna2, coluna3, etc).
db_select
a fazer o mesmoRespostas:
Supondo que você esteja tentando obter aproximadamente essa consulta:
Você usaria:
fonte
DISTINCT é na verdade um pós-modificador global para SELECT, ou seja, ao contrário de SELECT ALL (retornando todas as respostas), é SELECT DISTINCT (retornando todas as respostas exclusivas). Portanto, um único DISTINCT atua em TODAS as colunas que você fornecer.
Isso torna muito difícil o uso do DISTINCT em uma única coluna, enquanto as outras são obtidas, sem grandes retrocessos extremamente feios.
A resposta correta é usar um GROUP BY nas colunas em que você deseja obter respostas exclusivas:
fonte
COUNT(DISTINCT foo)
mas mesmo assim é um modificador da função agregadora.Remova
->distinct()
e substitua-o por$event_table->AddExpression('distinct e.nid', 'nid');
Igual a:
fonte
Se você usar essa consulta, ela fornecerá uma consulta distinta adequada.
fonte