Je comprends que vous pouvez spécifier -> distinct () sur l'instruction db_select afin qu'elle ne renvoie que des valeurs distinctes lorsque vous regardez TOUS les champs. Mais ce que je veux, c'est retourner des valeurs distinctes en ne regardant qu'un seul champ. Voici mon code:
$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');
Supposons que je veuille que la colonne distincte soit e.nid. On pourrait penser que -> distinct ('e.nid') fonctionnerait mais il renvoie toujours des valeurs distinctes basées sur tous les champs (c'est-à-dire distinct (colonnes1, colonne2, colonne3, etc.).
db_select
faire de mêmeRéponses:
En supposant que vous essayez d'accéder à peu près à cette requête:
Vous utiliseriez:
la source
DISTINCT est en fait un post-modificateur global pour SELECT, c'est-à-dire que, contrairement à SELECT ALL (renvoyant toutes les réponses), c'est SELECT DISTINCT (renvoyant toutes les réponses uniques). Un seul DISTINCT agit donc sur TOUTES les colonnes que vous lui donnez.
Cela rend très difficile l'utilisation de DISTINCT sur une seule colonne, tout en obtenant les autres colonnes, sans effectuer de backflips extrêmement moche.
La bonne réponse consiste à utiliser un GROUP BY sur les colonnes pour lesquelles vous souhaitez avoir des réponses uniques:
la source
COUNT(DISTINCT foo)
mais même alors, c'est un modificateur de la fonction d'agrégation.Retirez-le
->distinct()
et remplacez-le par$event_table->AddExpression('distinct e.nid', 'nid');
Ainsi:
la source
Si vous utilisez cette requête, elle fournit une requête distincte appropriée.
la source