Datenbankeinträge filtern, DISTINCT geht nicht... wer weiß was?
Stefan
- datenbank
0 ruben0 Stefan
0 Vinzenz Mai
Hallo,
erstmal vorab... ich bin sehr begeistert von diesem Forum, es hat mir schon des öfteren sehr geholfen, was mich im Endeffekt dazu bewegt hat mich zu regestrieren.
Nun zu meiner Frage:
Ich habe eine Tabelle playlists. In dieser Tabelle sind folgende Spalten vorhanden:
id
userid
playlist
title
category
pkey
dkey
Einträge für diese Tabelle könnten so aussehen:
id, userid, playlist, title, category, pkey, dkey
1 1 Test Test 1 KDBsd4 BD8saw
2 1 Test Test 1 KDBsd4 M48dal
3 1 ABC Test 1 LAT3dh EJWhd6
Jetzt möchte ich gucken wie viele Playlisten der Benutzer hat und möchte dieses Ergebnis mit mysql_num_rows überprüfen und anschließend mit mysql_fetch_assoc in ein array schreiben. Ich möchte natürlich im array nachher keine doppelten Einträge haben.
Wenn wir also mal das Beispiel von oben nehmen, hat dieser Benutzer 2 Playlisten (sichtbar am pkey bzw. playlist) und 3 Titel (sichtbar am dkey), davon 2 Titel in der gleichen playlist.
Jetzt möchte ich jede Playliste, wo der dementsprechende dkey noch nicht vorhanden ist in das array schreiben und da beginnt das Problem:
Ich habe es mit DISTINCT versucht aber er gibt mir trotzdem die Playliste aus, wo dieser Song schon gespeichert ist. Das heißt wenn ich jetzt die Datei BD8saw aufrufe, soll er als mögliche Playlisten nur noch ABC (pkey: LAT3dh) anzeigen, weil in der zweiten ist ja die Datei BD8saw schon gespeichert.
Ich würde mich freuen, wenn mit eventuell jemand den Syntax für die MySQL Abfrage hier posten könnte, ich habe es schon mit DISTINCT, sowie vielen anderen Möglichkeiten aus diesem und anderen Foren probiert. Das es mit DISTINCT nicht funktionieren kann ist mir mittlerweile klar geworden nachdem ich ca. 3 Stunden irgendwelche Forenbeiträge gelesen habe. Ich bin echt am Ende meines Wissens.
Danke schonmal im vorraus für Antworten :)
id, userid, playlist, title, category, pkey, dkey
1 1 Test Test 1 KDBsd4 BD8saw
2 1 Test Test 1 KDBsd4 M48dal
3 1 ABC Test 1 LAT3dh EJWhd6
Die Einträge für deine Tabelle sind etwas schwer zu verstehen.
Das ist die Tabelle für die Playlists? Jede Zeile = eine Playlist? Warum dann zwei gleiche Namen im Feld Playlist?
Ist es eher so, dass in playlists die Tracks gespeichert sind, die in jeder jeweiligen Playlist sind?
Die Anzahl Playlists pro User kriegst du schätzungsweise (wenn ich die Tabelle richtig verstehe) durch SELECT COUNT(DISTINCT(playlist)) FROM playlists GROUP BY userid
Also das GROUP BY ist vielleicht der Part, der dir bisher nicht unterkam.
Seh ich das denn richtig, dass dieser User (1) zwei Playlists hat? Test und ABC, wobei Test 2, ABC 1 Track hat?
Das müsste dieser Query nämlich herausfinden (also 2 Playlists, nicht die Anzahl der Tracks).
Jede Zeile = eine Playlist?
Nein, jede Zeile ist, wenn du so willst ein Track. Wenn 3 Zeilen den gleichen pkey bzw. playlist in der Spalte haben, bedeutet das, dass 3 Tracks/Titel in dieser Playliste existieren.
Ist es eher so, dass in playlists die Tracks gespeichert sind, die in jeder jeweiligen Playlist sind?
Ja
Wenn ich das jetzt mit der MySQL abfrage mache wie von dir beschrieben, erhalte ich als mysql_num_rows immer 1, ob der Titel schon in der Playliste ist oder nicht. Außerdem erhalte ich nun kein vernünftiges ergebnis mehr bei mysql_fetch_assoc... Die print_r ausgabe erzeugt folgendes:
Array ( [COUNT(DISTINCT( playlist))] => 1 )
Hast du oder jemand anders noch eine andere Idee?
Hallo Stefan,
Ich habe eine Tabelle playlists. In dieser Tabelle sind folgende Spalten vorhanden:
id
userid
playlist
title
category
pkey
dkeyEinträge für diese Tabelle könnten so aussehen:
id, userid, playlist, title, category, pkey, dkey
1 1 Test Test 1 KDBsd4 BD8saw
2 1 Test Test 1 KDBsd4 M48dal
3 1 ABC Test 1 LAT3dh EJWhd6
Jetzt möchte ich gucken wie viele Playlisten der Benutzer hat
SELECT -- Gib mir
userid, -- die Benutzer
COUNT(playlist) AS anzahl_playlisten -- und die Anzahl ihrer Playlisten
FROM playlists
GROUP BY userid -- je Benutzer
und möchte dieses Ergebnis mit mysql_num_rows überprüfen und anschließend mit mysql_fetch_assoc in ein array schreiben. Ich möchte natürlich im array nachher keine doppelten Einträge haben.
Keine Ahnung, was Du damit meinst. Es gibt hier keinen Grund, irgendetwas
anderes mit mysql_num_rows anzufangen als ob es überhaupt Ergebnisse gibt.
Jetzt möchte ich jede Playliste, wo der dementsprechende dkey noch nicht vorhanden ist
Was meinst Du damit? Kannst Du nicht einfach das gewünschte Ergebnis hier
angeben, als Tabelle - nicht als Array - mit der Begründung, warum Du dieses
Ergebnis haben möchtest.
Bitte gib *keine* PHP-Dinge an, die Du glaubst, benutzen zu müssen.
Bitte gib *keine* SQL-Anweisungen an, die Du glaubst, benutzen zu müssen.
Freundliche Grüße
Vinzenz
Hallo Vinzenz Mai,
SELECT -- Gib mir
userid, -- die Benutzer
COUNT(playlist) AS anzahl_playlisten -- und die Anzahl ihrer Playlisten
FROM playlists
GROUP BY userid -- je Benutzer
Diese MySQL abfrage funktioniert leider nicht. Ich erhalte nun keine Ergebnisse mehr aus der Datenbank. Leider weiß ich niht ganz genau was du mit AS anzahl\_playlisten meinst. Wenn ich das richtig verstehe soll ich dort einen INT-Wert angeben aber ich habe ja keine Ahnung wie viel Playlisten ein Benutzer hat bzw. das will ich ja mit der Abfrage erst rausbekommen.
> > Jetzt möchte ich jede Playliste, wo der dementsprechende dkey noch nicht vorhanden ist
>
> Was meinst Du damit? Kannst Du nicht einfach das gewünschte Ergebnis hier
> angeben, als Tabelle - nicht als Array - mit der Begründung, warum Du dieses
> Ergebnis haben möchtest.
Wenn wir mal mein Beispiel vom ersten Posting aufgreifen dann würde das Ergebnis so aussehen, wenn es ist wie ichs haben möchte.
| paylist |
\-----------
| Test |
| ABC |
---------
So sieht es jetzt aber danach aus als ob ich auch DISTINCT verwenden könnte. Aber ich möchte ja auch noch anhand von userid und dkey filtern, falls später mehr als nur eine userid und mehr als nur 2 Playlisten existieren
gruß Stefan
Entschuldige das ich nochmal schreibe aber ich möchte nicht das du dir unnötig gedanken machst.
Also mein Ergebnis soll so aussehen, wenn ich jetzt zum Beispiel den dkey BD8saw aufrufe mit der userid 1.
| playlist |
----------
| ABC |
| |
----------
Begründung: Wenn ich dkey BD8saw aufrufe sollte meine MySQL afrage erkennen, das es diesen dkey schon in zusammenhang mit der playliste Test gibt und soll von daher nur ABC als Ergebnis zurück geben.