Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Abfrage über mehrere Tabellen mit Filtern (MySQL)

Frage Entwicklung Datenbanken

Mitglied: rbaumann

rbaumann (Level 1) - Jetzt verbinden

02.11.2008, aktualisiert 03.11.2008, 9295 Aufrufe, 2 Kommentare

Guten Tag,

ich hoffe ihr könnt mir helfen, da ich mit Abfragen (PHP) mehrere Tabellen (MySQL) noch Probleme habe.

Ich habe folgende Tabellen:

1. Personen Tabelle mit Feldern:
ID,Name,Strasse,Ort...

2. Tabelle mit Produkt:
ID,Personen_ID,Name,Version,Anzahl

Inhalt z.B.
Personen:
1,Müller,Alfredweg 2,48912 Berlin
2,Meyer,Musterstr. 12,48916 Berlin

Produkte:
1,2,Windows,98,2
2,2,Windows,XP,5
3,2,Windows,XP,10
4,2,Windows,Vista,2
5,1,Windows,XP,1
6,1,Windows XP,2


Ich erstelle eine Übersichtsliste, in der alle Personen gelistet werden:

SELECT
Personen.ID,
Personen.Name,
Personen.Ort,
FROM Personen,Produkte
Where
Personen.ID=Produkte.Personen_ID
GROUP BY Personen.ID order by Personen.Name


1. Nun meine erste Frage:
Ich möchte in meiner Ansicht neben den Kundendaten in der jeweiligen Zeile auch mit Kürzeln anzeigen lassen, welche Produkte der jeweilige Kunde hat.

Also z.B.
Müller 48912 Berlin XP
Meyer 48916 Berlin 98 XP Vista

Bisher rufe ich für jede Zeile separat die Tabelle Produkte auf und lese die einzelnen Zeilen, um die Produkte auszulesen.

Das dauert natürlich entsprechend lange.
Wie kann ich direkt in der Select Abfrage die Daten so abfragen, dass ich meine Person nur einmal ausgeworfen bekomme, die Produkte dazu hintereinander in Feldern?


2. Filtern
Ich Filter in der Abfrage auch nach Produkten. Ich frage z.B. ab, welche Person Windows XP hat:

SELECT
Personen.ID,
Personen.Name,
Personen.Ort,
FROM Personen,Produkte
Where
Personen.ID=Produkte.Personen_ID
and Produkte.Version='XP'
GROUP BY Personen.ID order by Personen.Name

Soweit so gut.
Nun möchte ich aber auch abfragen, welche Person hat XP und noch kein Vista. Dies klappt so ja nicht, da ich ja nicht abfragen kann:
and Produkte.Version='XP' and Produkte.Version<>'Vista'

Das trifft ja immer zu, da die jeweilige Zeile aus Produkt mit XP ja logischerweise kein Vista sein kann.


3. Zählen und Filern

Zudem möchte ich abfragen, welche Person hat z.B. mehr als 10 Windows XP Lizenzen:

SELECT
Personen.ID,
Personen.Name,
Personen.Ort,
FROM Personen,Produkte
Where
Personen.ID=Produkte.Personen_ID
and Produkte.Version='XP' and Produkte.Anzahl>'10'
GROUP BY Personen.ID order by Personen.Name

Das Ergebnis stimmt nicht, da es mehrere Zeilen mit dem Produkt XP für die Person gibt. Die Anzahl müßte addiert werden. Wie bringe ich das noch mit unter?


Es sind viele Fragen, ich hoffe aber dass mir jemand einen Lösungsansatz geben kann.

Vielen Dank

Richard
Mitglied: dog
02.11.2008 um 14:39 Uhr
Hallo,

1. Such mal bei Google nach "mysql column with comma separted list subquery" - Das geht so nicht ohne einige Umwege in Mysql.
Wenn du allerdings allein diese Datenbank benutzt (oder mit unter 500 Leuten gleichzeitig) sollte zwischen einer iterativen Lösung in PHP und einer direkten in MySQL kein Unterschied feststellbar sein. Alternativ kannst du diese Abfrage benutzen:
01.
SELECT p.Name, p.Ort, o.Version 
02.
FROM Personen AS p 
03.
LEFT JOIN Produkte AS o ON p.ID=o.Personen_ID;
Da du aber eine 1:n Relation hast wirst du hiermit mehrere Zeilen pro Kunde erhalten, du müsstest also in PHP noch doppeltes Filtern und die Kommaliste erstellen.

2. Ungetestet!
01.
SELECT p.ID, p.Name, p.Ort 
02.
FROM Personen AS p 
03.
WHERE  
04.
	(SELECT COUNT(*) FROM Produkte AS o WHERE o.person_ID=p.ID AND o.Version = 'XP') > 0 AND 
05.
	(SELECT COUNT(*) FROM Produkte AS o WHERE o.person_ID=p.ID AND o.Version = 'Vista') < 1;
3. Auch ungetestet
01.
SELECT p.ID, p.Name, p.Ort 
02.
FROM Personen AS p, Produkte AS o 
03.
WHERE  
04.
	p.ID = o.person_ID AND 
05.
	o.Version = "XP" AND 
06.
	SUM(o.Anzahl) > 10;
Bitte warten ..
Mitglied: Biber
03.11.2008 um 07:45 Uhr
Moin rbaumann,

nur eine kleine Variation zu dogs Ausführungen.
Das Statemennt 2 würde ich aus Gründen der Lesbarkeit so schreiben:
01.
SELECT p.ID, p.Name, p.Ort 
02.
FROM Personen AS p 
03.
WHERE Exists (  
04.
      SELECT 47 from Produkte as o  
05.
        WHERE o.person_ID=p.ID AND o.Version = 'XP') 
06.
AND  
07.
  NOT Exists (  
08.
      SELECT 11 from Produkte AS o  
09.
        WHERE o.person_ID=p.ID AND o.Version = 'Vista');
Ist aber eher aus Gründen der Verständlichkeit - performant wird weder dogs noch mein Ansatz werden (können).
Wenn Du wirklich Fragestellungen dieser Art und ein halbwegs nennenswertes Datenvolumen vorliegen hast, dann vergiss denn akademischen Unsinn mit 3.Normalform und so was und DE-normalisiere Deine Tabellen (bei Produkte ein Feld für "Anzahl WindowsXP", ein Feld für "Anzahl Vi$ta", ein Feld für ... [alle häufigen], ein Textfeld Varchar(200) für Exoten.)

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
PHP
MySQL-Abfrage mit php: Wert + true bzw. false (2)

Frage von tomolpi zum Thema PHP ...

Datenbanken
gelöst Schleifen in SQL-Abfrage bei 2 Tabellen (2)

Frage von Aximand zum Thema Datenbanken ...

Datenbanken
gelöst MYSQL Abfrage (20)

Frage von datadexx zum Thema Datenbanken ...

Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...