![]() |
[SQL] Anzahl ältester Werte pro ID auslesen
Hallo,
also ein besserer Titel ist mir keiner eingefallen, das ist auch verdammt schwer. *g* Ich habe eine MySQL-Tabelle mit u.a. diesen Spalten: id (einmalig), article_id (kann gleiche Werte enthalten) und user_id (kann ebenfalls gleiche Werte enthalten) Nun kann der Inhalt beispielsweise so aussehen:
Code:
So schön wird das übrigens nicht geordnet sein, sondern eher wild durcheinander.
id article_id user_id
[b][color=#ff0000]1 1 1[/color][/b] 2 1 1 3 1 4 [b][color=#ff0000]5 2 1[/color][/b] 6 2 2 7 2 2 10 3 2 11 3 1 [b][color=#ff0000]12 4 1[/color][/b] 14 4 6 15 6 2 Nun möchte ich die Anzahl der Datensätze ermitteln, die für eine bestimmte User-ID zutreffen (das ist ja kein Problem). Jedoch soll pro Artikel-ID-Block nur der älteste Eintrag überprüft werden (kleinste id). Ein Beispiel: User mit ID 1 Zurückgegeben sollen nun die rot markierten Datensätze bzw. die Anzahl, in dem Fall 3. Die Anzahl interessiert mich eher, aber es wäre auch schön, wenn man (mit einer 2. Abfrage) die Datensätze selbst zurückgeben könnte. Mein Problem besteht im Sortieren der einzelnen Artikel-ID-Blöcke. Ich habe schon mit MIN, DISTINCT, GROUP BY & Co. herumprobiert, doch kam immer irgendwas falsches zurück, deshalb schreibe ich meine Fehlversuche hier gar nicht erst hin. Es wären ohnehin zu viele. Und alles Auslesen und dann mit PHP sortieren möchte ich auch nicht bzw. nur im aller äußersten Notfall. Könnt ihr mir sagen wie das geht bzw. ob es überhaupt rein mit MySQL möglich ist ohne zig Abfragen zu benötigen? Grüße, Matze |
Re: [SQL] Anzahl ältester Werte pro ID auslesen
SQL-Code:
Das funktioniert.. Allerdings weiss ich nicht, wie schnell das ist ;)
select id, article_id, user_id from foo where id in (
select _inner.id from foo _inner where _inner.user_id = 1 group by _inner.article_id, _inner.id having _inner.id = (select min(_inner2.id) from foo _inner2 where _inner2.article_id = _inner.article_id) order by _inner.id ) Edit: eine Million Zeilen durchpflügt mein Rechner in unter einer Sekunde - reicht das? |
Re: [SQL] Anzahl ältester Werte pro ID auslesen
Warum so kompliziert?
SQL-Code:
Und für alle User...
SELECT id, article_id, user_id
FROM foo x WHERE user_id = 1 GROUP BY article_id, id, user_id HAVING id = (SELECT MIN(id) FROM foo WHERE article_id = x.article_id) ORDER BY id
SQL-Code:
Und was meinst du mit der Anzahl? Vielleicht folgendes...
SELECT id, article_id, user_id
FROM foo x GROUP BY article_id, id, user_id HAVING id = (SELECT MIN(id) FROM foo WHERE article_id = x.article_id) ORDER BY user_id, id
SQL-Code:
Gruss
SELECT user_id, COUNT(*) AS anzahl
FROM (SELECT user_id FROM foo x GROUP BY id, user_id, article_id HAVING id = (SELECT MIN(id) FROM foo WHERE article_id = x.article_id)) x GROUP BY user_id ORDER BY user_id Thorsten |
Re: [SQL] Anzahl ältester Werte pro ID auslesen
Zitat:
|
Re: [SQL] Anzahl ältester Werte pro ID auslesen
Wieso soll der Datensatz ID=11 nicht geliefert werden?
Und wieso geht das nicht?
SQL-Code:
select user_Id, artikel_ID, min (ID) as MinID
from Tabelle group by user_ID, artikel_ID |
Re: [SQL] Anzahl ältester Werte pro ID auslesen
Hallo, danke für die Antworten.
@Thorsten: Deine erste Abfrage scheint zu funktionieren, doch die Ermittlung der Anzahl bekomme ich nicht ganz hin. Unter der "Anzahl" verstehe ich die Anzahl der Datensätze, die deine erste Abfrage zurückgeben würde. Ich erhalte immer den Fehler "Unknown column 'id' in 'having clause'" und bekomme ihn irgendwie nicht weg. Mit PHP ginge es so: count($Datensaetze_Aus_Quary_1); Also könnte ich theoretisch auch die erste Abfrage für die Einträge und die Anzahl nutzen. Die erste Abfrage konnte ich nachvollziehen, doch die zur Ermittlung der Anzahl der Datensätze ist mir eine Nummer zu groß. :gruebel: @alzaimar: Die ID 11 gehört zur Artikel-ID 3. Ein älterer Eintrag mit ID 10 jedoch ebenfalls. Und mir geht es daraum, nur die ältesten Einträge pro Artikel-ID zu berücksichtigen. Grüße |
Re: [SQL] Anzahl ältester Werte pro ID auslesen
Das ist komisch, habe mit MySQL5 keinen Fehler bekommen. Welche Version setzt du ein?
Versuch es mal so...
SQL-Code:
Gruss
SELECT user_id, COUNT(*) AS anzahl
FROM (SELECT id, user_id, article_id FROM foo x GROUP BY id, user_id, article_id HAVING id = (SELECT MIN(id) FROM foo WHERE article_id = x.article_id)) x GROUP BY user_id ORDER BY user_id Thorsten |
Re: [SQL] Anzahl ältester Werte pro ID auslesen
Hallo Thorsten,
online nutze ich Version 5, lokal noch 4 (ich sollte mal updaten). Deine neue Abfrage funktioniert, vielen Dank! Alleine wäre ich da nie drauf gekommen. Grüße, Matze |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz