AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

Ein Thema von TheMiller · begonnen am 30. Mai 2011 · letzter Beitrag vom 1. Jun 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 30. Mai 2011, 23:15
Datenbank: MySQL • Version: 5+ • Zugriff über: Konsole
Hallo!

Ich habe mal wieder ein Problem mit einem SQL-Statement. Ich habe zwei Tabellen, eine Kunden-Tabelle und eine kundenbezogene Tabelle, die mehrere Einträge pro Kunde enthalten kann.

Ich möchte jetzt eine Abfrage erstellen, dir mir folgendes liefert.

Alle Kunden, deren Nachname mit [Buchstabe] beginnt und von jedem einzelnen Kunden alle Einträge aus der kundenspezifischen Tabelle.

Dies könnte so aussehen:

Code:
Suche nach "M"
Müller, Klaus  | Tacker
                | Locher
                | Heftklammern
Meyer, Uli     | Blöcke
Maier, Frank   | Tacker
                | Blöcke
.... ... .... ... ... ..
Das Problem ist nicht das mit dem Anfangsbuchstaben. Das Problem ist das auslesen der weiteren Datensätze aus der anderen Tabelle. Einen JOIN oder so bekomme ich nicht hin aber mehrere Abfragen möchte ich auch nicht ausführen (Serverlast).
Oder soll ich zwei Abfragen ausführen - eine für die Kunden mit [Buchstabe] und dann eine mit den Kundendaten und diese zwei Ergebnisse durch Sortieralgorithmen zusammenführen?

Vielen Dank im Voraus.
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 30. Mai 2011, 23:30
Warum keinen JOIN?

Nehmen wir mal an, die Tabellen heissen "kunden" und "kunden_data", du willst alle Felder und der Primary Key aus Kunden heisst ID, in kunden_data der zugehörige Fremdschlüssel kundenID:

Code:
SELECT kunden.*,kunden_data.* FROM kunden INNER JOIN kunden_data ON kunden.ID=kunden_data.KundenID WHERE kunden.nachname LIKE ('M%') ORDER BY kunden.nachname ASC, kunden.vorname ASC, kunden.ID ASC;
Damit bekommst du für jeden Eintrag der kunden_data Tabelle eine Ergebniszeile, mit dem entsprechenden, übergeordneten Datensatz der kunden-Tabelle zusammengefügt, alphabetisch nach Nachname und Vorname geordnet:


kunden.ID kunden.nachname kunden.vorname kunden_data.artikel
-----------------------------------------------------------------
0 Maier Frank Tacker
0 Maier Frank Blöcke
1 Meyer Uli Blöcke
2 Müller Klaus Tacker
2 Müller Klaus Locher
2 Müller Klaus Heftklammern
usw....


Das kannst du dann clientseitig auswerten und dementsprechend anzeigen.
(z.B. in einer Schleife, solange sich beim Durchgehen der Datensätze die kunden.ID nicht ändert, ist es der gleiche Kunde usw.)

P.S:
Wenn du ebenso alle Datensätze aus kunden haben willst, die keinen eintrag in kunden_data haben, dann brauchst du einen LEFT JOIN.
Optimieren kannst du das natürlich, indem du nicht alles (*) aus beiden Tabellen holst, sondern nur die Felder, die du auch brauchst.
Das ganze ging auch noch als zweiter Weg über SubSelects, aber der mySQL-Optimizer mag JOINS lieber als Subselects, auch wenn diese oft sehr praktisch sind.

Geändert von blackfin (30. Mai 2011 um 23:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von simmi
simmi

Registriert seit: 24. Nov 2004
Ort: Röbel/Müritz
112 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 31. Mai 2011, 09:36
Hallo,

auf dieser Seite gibt es zu SQL und anderem gute Erklärung. Schönes Nachschlagewerk.
http://sql.1keydata.com/de/

Grüße
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 31. Mai 2011, 10:35
Rückfrage, wofür soll das gut sein?
Einzig für die Darstellung? Dann würde ich Dir empfehlen, das über Delphi zu lösen.
Wenn es über reines SQL gehen soll, dann nimm soetwas
Code:
select Kundenname ,Produktname
from...
where ...
and produktid=max(produktid)
...
union
select '     ',produktname
from
where ...
and produktid<>max(produktid)
order by kundenid
wahrscheinlich mußt Du
Code:
max(produktid)
durch einen Subselect ersetzen.
Wichtig ist, daß Du die Datensätze mit ond ohne Namen sauber voneinander trennen kannst.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
omata

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

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 31. Mai 2011, 11:11
Im Prinzip sehe ich das so wie blackfin...

Ich würde das allerdings kürzer und übersichtlicher formatieren (ist nur Geschmacksache):
SQL-Code:
SELECT *
FROM kunden k
INNER JOIN kunden_data kd
  ON k.ID = kd.KundenID
WHERE nachname LIKE 'M%
ORDER BY nachname, vorname, k.ID
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 31. Mai 2011, 17:49
Danke für die Antworten. Ich habe das Problem erkannt und ihr konntet nicht wissen, was ich möchte - ich konnte es gestern Abend nicht mehr so recht beschreiben.

Also ich möchte - wenn wir bei dem Beispiel hier bleiben - alle Produkte auflisten, die die Kunden gekauft haben und mit [Buchstabe] anfangen (daher LIKE ('T%')). Unter jedem Kundeneintrag steht dann: Der Kunde hat auch noch [....] gekauft. Dort stehen dann Artikel mit anderen Anfangsbuchstaben - und genau hier liegt das Problem. Ich frage ja in der Tabelle explizit nur nach den Buchstaben mit [Buchstabe], will dann aber auch alle anderen anzeigen.

Bleibt da jetzt nur ein SubSelect (und wenn ja wie performant ist dieser), oder soll ich mir alle Daten laden, diese dann nach Buchstaben sortieren und den mit [Buchstabe] ganz oben anzeigen? Ich arbeite in PHP.

Vielen Dank im Voraus und sry für die schlechte Beschreibung gestern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 31. Mai 2011, 18:32
Danke für die Antworten. Ich habe das Problem erkannt und ihr konntet nicht wissen, was ich möchte - ich konnte es gestern Abend nicht mehr so recht beschreiben.

Also ich möchte - wenn wir bei dem Beispiel hier bleiben - alle Produkte auflisten, die die Kunden gekauft haben und mit [Buchstabe] anfangen (daher LIKE ('T%')). Unter jedem Kundeneintrag steht dann: Der Kunde hat auch noch [....] gekauft. Dort stehen dann Artikel mit anderen Anfangsbuchstaben - und genau hier liegt das Problem. Ich frage ja in der Tabelle explizit nur nach den Buchstaben mit [Buchstabe], will dann aber auch alle anderen anzeigen.

Bleibt da jetzt nur ein SubSelect (und wenn ja wie performant ist dieser), oder soll ich mir alle Daten laden, diese dann nach Buchstaben sortieren und den mit [Buchstabe] ganz oben anzeigen? Ich arbeite in PHP.

Vielen Dank im Voraus und sry für die schlechte Beschreibung gestern.

Soll jetzt beim Kundennamen oder beim Produktnamen nach dem Anfangsbuchstaben gesucht werden?

Am besten du gibst mal ein paar Beispieldaten (vor allem auch solche, die nicht angezeigt werden sollen) und dann das gewünschte Ergebnis.

Im Moment ist das noch etwas konfus
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#8

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 1. Jun 2011, 09:10
Morgen,

ich sehe gerade, dass mein Beispiel auf dem ersten Post auch recht misslungen ist. Es soll nicht nach Kundenname, sondern nach Produktname sortiert werden. Also ganz konkret:

Zeige mir alle Kunden, die Produkte mit [Buchstabe] gekauft haben, und unter jedem Kundeneintrag noch weitere Produkte, die er auch (mal) gekauft hat.

Fragt bitte nicht nach dem Sinn und Zweck - ich brauche dieses Ergebnis. Die Frage ist nur, wie ich eine solche Sache performant löse. Einmal Frage ich die Produkttabelle mit Kondition ab, einmal ohne. Soll ich mir nicht einfach einmal alle Daten holen und dann sortieren, oder lieber ein SubSelect etc benutzen?

Ich habe nochmal ein Bild angehängt, wie das Ergebnis aussehen könnte.

Danke nochmal.
Miniaturansicht angehängter Grafiken
produkte.png  
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 1. Jun 2011, 09:28
Obwohl ich das Gefühl habe, dass da noch eine Tabelle fehlt (ungetestet):
SQL-Code:
SELECT
  K.Name, P2.Name
FROM
  Produkte P
JOIN
  Kunden K ON K.ID = P.Kunden_ID
JOIN
  Produkte P2 ON P2.Kunden_ID = K.ID
WHERE
  P.Name LIKE 'T%'
P2.Name könnte man ggf. noch mit GROUP_CONCAT zusammenfassen, um das Ergebnis wie in Deinem Beispiel zu erhalten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#10

AW: Select mit Where-Klausel und von dessem Ergebnis alle "Unterdaten" ermitteln

  Alt 1. Jun 2011, 09:45
@DeddyH: Ich kann mich täuschen, aber holt deine Abfrage nicht nur die Datensätze, bei denen der Produktname mit 'T' anfängt? (jedoch nicht die anderen für die Anzeige "Hat auch nocht gekauft: xxx")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14: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