Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [SQL] Anzahl ältester Werte pro ID auslesen (https://www.delphipraxis.net/114976-%5Bsql%5D-anzahl-aeltester-werte-pro-id-auslesen.html)

Matze 3. Jun 2008 21:01


[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:
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
So schön wird das übrigens nicht geordnet sein, sondern eher wild durcheinander.
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

Dax 3. Jun 2008 21:32

Re: [SQL] Anzahl ältester Werte pro ID auslesen
 
SQL-Code:
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
   )
Das funktioniert.. Allerdings weiss ich nicht, wie schnell das ist ;)

Edit: eine Million Zeilen durchpflügt mein Rechner in unter einer Sekunde - reicht das?

omata 3. Jun 2008 23:37

Re: [SQL] Anzahl ältester Werte pro ID auslesen
 
Warum so kompliziert?

SQL-Code:
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
Und für alle User...
SQL-Code:
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
Und was meinst du mit der Anzahl? Vielleicht folgendes...
SQL-Code:
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
Gruss
Thorsten

Dax 3. Jun 2008 23:38

Re: [SQL] Anzahl ältester Werte pro ID auslesen
 
Zitat:

Zitat von omata
Warum so kompliziert?

Betriebsblindheit ;) Passiert mir öfter mal..

alzaimar 4. Jun 2008 07:16

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

Matze 4. Jun 2008 13:31

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

omata 4. Jun 2008 16:18

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:
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
Gruss
Thorsten

Matze 4. Jun 2008 16:30

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