AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [SQL] Anzahl ältester Werte pro ID auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

[SQL] Anzahl ältester Werte pro ID auslesen

Ein Thema von Matze · begonnen am 3. Jun 2008 · letzter Beitrag vom 4. Jun 2008
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

[SQL] Anzahl ältester Werte pro ID auslesen

  Alt 3. Jun 2008, 21:01
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
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

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

  Alt 3. Jun 2008, 21:32
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?
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 3. Jun 2008, 23:37
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
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

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

  Alt 3. Jun 2008, 23:38
Zitat von omata:
Warum so kompliziert?
Betriebsblindheit Passiert mir öfter mal..
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

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

  Alt 4. Jun 2008, 07:16
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
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 4. Jun 2008, 13:31
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ß.

@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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 4. Jun 2008, 16:18
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
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 4. Jun 2008, 16:30
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz