# SQL DISTINCT oder GROUP BY oder beides



## Hannibal (17. April 2008)

*Nachtrag: Wichtig ich arbeite mit MYSQL und PHP*

Hallo, ich habe beim Auslesen der Datensätze ein Problem mit den doppelten Einträgen welche ich nicht anzeigen möchte.

Ich habe in meiner Bildergalerie zusätzlich eine Tabelle namens: "lastviewed_images" darin speichere ich

ID (Id der aktivität)
lastviewed (timestamp)
picID (ID des angeschauten Bildes)
by_user_id (User ID oder 0 für Gast)

Nun speichere ich bei jedem klick auf ein Bild diese Aktivität. Das heisst wenn ein Bild mehrmals angeschaut wird ist dieses in meiner lastviewed_images Tabelle mehrmals drin.

Um aber nun beim anzeigen der Zuletzt angeschauten Bilder keine gleichen Einträge zu haben wollte ich dies mit Distinct machen. Doch mein Problem ist nur dass bei meinem Select nun nicht die allerneusten Aktivitäten eines Bildes gezählt werden sondern wohl die erste Aktivität.

Wie kann ich das ganze nun so auslesen dass ich keine Bilder doppelt angezeigt bekomme aber jene welche ich zeige wirklich die zuletzt angeschauten Bilder sind?

Hier mein Query:


```
SELECT DISTINCT a.ID, a.VonUser, a.ViewCount, a.punkte, c.Nickname AS uploadernick FROM Images as a 
          INNER JOIN lastviewed_images AS b ON a.ID = b.picID
          INNER JOIN userdaten AS c ON a.VonUser = c.Id
          WHERE (Deleted = 'No') order by b.lastviewed DESC limit 6
```

Vielen Dank

Nachtrag: Wichtig ich arbeite mit MYSQL und PHP


----------



## shutdown (17. April 2008)

probier's mal so:


```
select <bilder_daten> from images
where <bilder_id> in (
    select distinct <bilder_id> from lastviewed_images
)
```


----------



## Hannibal (17. April 2008)

Danke für die schnelle Antwort, dass bekomme ich so aber nicht hin.

Ich hab jetzt mal etwas so rumprobiert und musste den Server dann neustarten weil das irgendwie ein Endlos- Loop wird.

Wichtig ist, ich muss aus 3 Tabllen selektieren.

Images
userdaten
lastviewed_images

Villeicht geh ich da ganz falsch ran, aber bitte gebt mir noch einen weiteren Lösungsansatz.

Danke


----------



## shutdown (17. April 2008)

Das mit deinen Userdaten war aus deiner Frage nicht wirklich zu erkennen - es sei denn man liest mit ner Lupe 


> Ich hab jetzt mal etwas so rumprobiert und musste den Server dann neustarten weil das irgendwie ein Endlos- Loop wird.



Weniger eine Endlosschleife, wohl eher ein verdammt großer Select, weil du die Joins nicht sauber gesetzt und damit ein gewaltiges Kreuzprodukt ausgelöst hast.
Von welchen Datenmengen reden wir hier eigentlich (User, Bilder, und wie viele Bilder-pro-Nutzer-Zuordnungen)?

Habe ich das jetzt richtig verstanden:
Du möchtest die zuletzt angezeigten Bilder eines jeden Users anzeigen?
Also dürfen Bilder grundsätzlich schon mehrfach auftauchen - nur halt nicht mehrfach bei ein und demselben User?

Dann probier es mal so (Spalten und Tabellennamen noch anzupassen):


```
select distinct <zuordnungs_daten>, <benötigte_userdaten> from <zuordnungen>, <user>
where <zuordnungen_user_id> = <user_user_id> into temp zuordnungen;

select <bilder_daten>, <benötigte_userdaten>
from <bilder>, zuordnungen 
where <bilder_id> = zuordnungen.<zuordnungen_bilder_id>;

drop table zuordnungen;
```


----------



## Chaosengel_Gabriel (18. April 2008)

Anstatt JOIN zu verwenden, könntest du die User Daten auch in nem 2ten Statement auslesen und dann via PHP dem ersten zuordnen...

Ich kenn das Problem selbst auch mit den JOINs, da verkompliziert man das ganze sehr schnell ^^

Bezüglich der Bilder hol dir doch alle Datensätze aus der Tabelle und lass php dann den timestamp prüfen... Dann müsste es auch möglich sein, dass du doppelte Bilder ausselektierst...
Wenn du das Statementergebnis mittels ORDER BY nachm TimeStamp ordnen lässt, dann hast du nur die aktuellsten... In welcher Richtung (ASC/DESC) weiß ich grad nich genau ^^

Prasktisch wäre es ja, wenn man das Statement die Datensätze so geordnet auslesen lassen kann und sobald ne id gelesen wird, die bereits gelesen wurde, dann wird dieser Datensatz übersprungen... Aber da mangelt es mir an Kenntnissen ^^


----------

