2009-05-13 4 views
2

Ich habe eine Abfrage wie diese (Mysql 5.x, PHP - für Lesbarkeit formatiert)GROUP BY, ORDER BY - Wie Gruppe Artikel von betrachten neueste Apperance machen

$query =" 
SELECT 
    p.p_pid, 
    p.p_name, 
    p.p_url 
FROM 
    activity a, 
    products p 
WHERE 
    a.a_uid= ".$uid_int." 
    AND a.a_pid > 0 
    AND p.p_pid = a.a_pid 
GROUP BY 
    a.a_pid 
ORDER BY 
    a.a_time DESC LIMIT 6 
"); 

Im Allgemeinen ist es ein produzieren sollte einzigartige Liste der 6 neuesten Produkte, die der Benutzer gesehen hat.

Das Problem ist, wenn der Benutzer ein Produkt mehr als einmal gesehen hat. Einer von ihnen in den letzten 6 Aktivitäten und einer von ihnen vor den letzten 6 Aktivitäten liefert die Abfrage das Produkt nicht zurück. Ich nehme an, dass die (Gruppe von) a_time nicht mit dem spätesten Zeitpunkt des Erscheinens des Produktes verlässt. Wie kann ich das korrigieren?

Antwort

2

Haben Sie versucht, von MAX (a.a_time) zu bestellen?

Als bewährte Methode verwenden Sie GROUP BY für jede Spalte, die Sie ohne Aggregat verwenden. MySQL ist eine der wenigen Datenbanken, die es Ihnen ermöglichen, eine Spalte zu verwenden, die nicht gruppiert ist. Sie erhalten eine zufällige Spalte aus den von Ihnen ausgewählten Zeilen.

1

Ich hoffe, dass $uid_int Variable für SQL-Injection doppelt überprüft wird.

$query =" 
SELECT 
    MAX(p.p_pid) p_pid, 
    MAX(p.p_name) p_name, 
    MAX(p.p_url) p_url 
FROM 
    activity a 
    INNER JOIN products p ON p.p_pid = a.a_pid 
WHERE 
    a.a_uid= ".$uid_int." 
    AND a.a_pid > 0 
GROUP BY 
    a.a_pid 
ORDER BY 
    MAX(a.a_time) DESC 
LIMIT 6 
"); 

Manchmal frage ich mich, ob es eine gute Design-Entscheidung von MySQL war ohne explizite Aggregation Gruppierung zu ermöglichen ...

+0

Dank !. Warum brauche ich MAX auf p_name etc ..? Das sind Strings. – Nir

+0

Ich habe das auch zuerst geschrieben, aber eine Gruppe von a.a_pid ist wirklich eine Gruppe auf p. So scheint es, dass er nach Produkt gruppieren möchte und die letzten 6 Produkte mit Aktivität findet. – Andomar

+1

@Nir: Dies sind * nicht * Zeichenketten. Dies sind * Gruppen von * Strings, gruppiert nach a.a_pid. Aus diesem Grund müssen Sie eine Aggregationsfunktion verwenden, um eine Zeichenfolge der Gruppe auszuwählen. Auch wenn MySQL hier etwas Schlamperei erlaubt und es sogar bequem erscheinen mag - das Problem wurde nicht durch eine Aggregationsfunktion verursacht, wo es angebracht war. – Tomalak