Ich verstehe, dass Sie in der Anweisung db_select -> unique () angeben können, damit nur beim Betrachten ALLER Felder unterschiedliche Werte zurückgegeben werden. Ich möchte jedoch unterschiedliche Werte zurückgeben, indem ich nur EIN Feld betrachte. Hier ist mein 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');
Angenommen, ich möchte, dass die eindeutige Spalte e.nid ist. Sie würden denken, dass -> different ('e.nid') funktionieren würde, aber es werden immer noch unterschiedliche Werte basierend auf allen Feldern zurückgegeben (dh different (Spalten1, Spalte2, Spalte3 usw.).
db_select
, dasselbe zu tunAntworten:
Angenommen, Sie versuchen, ungefähr zu dieser Abfrage zu gelangen:
Sie würden verwenden:
quelle
DISTINCT ist eigentlich ein globaler Post-Modifikator für SELECT, dh im Gegensatz zu SELECT ALL (Rückgabe aller Antworten) ist es SELECT DISTINCT (Rückgabe aller eindeutigen Antworten). Ein einzelnes DISTINCT wirkt also auf ALLE Spalten, die Sie ihm geben.
Dies macht es wirklich schwierig, DISTINCT für eine einzelne Spalte zu verwenden, während die anderen Spalten abgerufen werden, ohne größere, extrem hässliche Backflips auszuführen.
Die richtige Antwort besteht darin, ein GROUP BY für die Spalten zu verwenden, für die Sie eindeutige Antworten erhalten möchten:
quelle
COUNT(DISTINCT foo)
aber selbst dann ist es ein Modifikator der Aggregatorfunktion.Entfernen
->distinct()
und ersetzen Sie es durch$event_table->AddExpression('distinct e.nid', 'nid');
Wie so:
quelle
Wenn Sie diese Abfrage dann verwenden, bietet sie eine ordnungsgemäße eindeutige Abfrage.
quelle