Multipler Output von SQL-Datensätzen
Sinabell
- datenbank
Hallo zusammen!
Ich hänge nun schon ziemlich lange an einem Problem, welches ich schonmal hatte und nach langem suchen auch gelöst hatte. Leider kann ich mich beim besten Willen nicht mehr an die Lösung erinnern.
Ich habe folgende SQL-Abfrage:
SELECT
t1.id AS pc_id,
t1.requester AS pc_requester,
t1.serial AS pc_serial,
t1.anlagennr AS pc_anlagennr,
t1.dose AS pc_dose,
t3.ort AS standort_ort
FROM
tbl_pc AS t1
LEFT JOIN
tbl_netzwerk AS t2 ON t2.standort = t1.dose
LEFT JOIN
tbl_standort AS t3 ON t3.id = t2.standort
WHERE
t1.requester LIKE '%".$_POST['requester']."%'
AND
t1.serial LIKE '%".$_POST['serial']."%'
AND
t1.anlagennr LIKE '%".$_POST['anlagennr']."%'
AND
t1.skartiert = '0'
AND
t1.kostenstelle >= '".$ks_min."'
AND
t1.kostenstelle <= '".$ks_max."'
AND
t1.aktiv = '1'
ORDER BY
t1.requester ASC
Es werden auch alle Datensätze richtig ausgegeben...nur leider jeder Datensatz exakt 6x in Folge!
Wie kann ich dies lösen?
Danke im Vorhinein.
Gruß
Daniel
Hi,
SELECT DISTINCT
oder
GROUP BY
~dave
moin,
SELECT DISTINCT
oder
GROUP BY
beides keine guten wege, besser nicht die OUTER JOINS einsetzen (wie immermein Leitspruch graits dazu: Joins sind böse), sondern korrelierte Unterabfragen benutzen. dann passt es auch mit der anzahl der datensätze.
Ilja
Hi,
SELECT DISTINCT
oder
GROUP BY
~dave
DISTINCT war die Lösung.
Vielen Dank für die Hilfe! :-)
Gruß
Daniel
Hi!
FROM tbl\_pc AS t1 LEFT JOIN tbl\_netzwerk AS t2 ON t2.standort = t1.dose LEFT JOIN tbl\_standort AS t3 ON t3.id = t2.standort
Es werden auch alle Datensätze richtig ausgegeben...nur leider jeder Datensatz exakt 6x in Folge!
Du hast drei Tabellen, die du miteinander verknüpfst. Von t2 willst du gar keine Daten haben. Du verknüpfst über t1.dose = t2.standort = t3.id. Warum lässt du nicht den Standort weg, wenn sich letztlich t1.dose = t3.id ergibt? Dass du mehrfache Ergebnisse bekommst, liegt wohl an den Daten. Zu den jeweiligen t1.dose lassen sich vermutlich 6 t2.standorte finden. t3.id wird es nur einmal geben, sonst wäre auch 2 t2 mal 3 t3 oder 3 t2 mal 2 t3 möglich.
Lo!
Hi!
FROM tbl\_pc AS t1 LEFT JOIN tbl\_netzwerk AS t2 ON t2.standort = t1.dose LEFT JOIN tbl\_standort AS t3 ON t3.id = t2.standort
Es werden auch alle Datensätze richtig ausgegeben...nur leider jeder Datensatz exakt 6x in Folge!
Du hast drei Tabellen, die du miteinander verknüpfst. Von t2 willst du gar keine Daten haben. Du verknüpfst über t1.dose = t2.standort = t3.id. Warum lässt du nicht den Standort weg, wenn sich letztlich t1.dose = t3.id ergibt? Dass du mehrfache Ergebnisse bekommst, liegt wohl an den Daten. Zu den jeweiligen t1.dose lassen sich vermutlich 6 t2.standorte finden. t3.id wird es nur einmal geben, sonst wäre auch 2 t2 mal 3 t3 oder 3 t2 mal 2 t3 möglich.
Lo!
Hallo!
Diese Abfrage nutzt lediglich einen Teil der Tabellen, welche einen Datenpool für mehrere PHP-Module darstellen. Der Umweg über tbl_netzwerk ist gewollt und muss so fungieren. ;-)
Verstehe, weil also mehrere Ergebnisse durch das LEFT JOIN gefunden werden, gibt SQL den Datensatz auch mehrfach zurück. Gut, ich werde erstmal DISTINCT einsetzen, da es das Problem behebt, da das Modul benötigt wird. Werde aber noch sehen ob ich die Abfrage brauchbar verbessern kann. Vielen Dank.
Gruß
Daniel
Hi!
Bitte zitiere in der hier üblichen Weise und nicht Full-Qoute mit Text drunter. Danke.
Verstehe, weil also mehrere Ergebnisse durch das LEFT JOIN gefunden werden, gibt SQL den Datensatz auch mehrfach zurück.
Naja, wenn du bei einem Join wird immer das kartesische Produkt gebildet, also alle Datensätze von links werden mit denen von rechts multipliziert.
Gut, ich werde erstmal DISTINCT einsetzen, da es das Problem behebt, da das Modul benötigt wird.
Warum auch immer deine Datenstruktur so aufgebaut ist, dass bei dieser Abfrage mehrere Datensätze in der anderen Tabelle gefunden werden, DISTINCT ist nicht die beste Lösung. Denn dieses nimmt sich irgendeinen Datensatz. Das Ergebnis aus der dritten Tabelle ist damit ein zufälliges. Wenn das aufgrund deiner Daten doch stets das selbe ergibt, dann machst du was verkehrt. Um da was konkret besseres vorschlagen zu können, müsste man Bedeutung der Felder und ihre Zusammenhänge kennen.
Werde aber noch sehen ob ich die Abfrage brauchbar verbessern kann.
Auch das von Ilja vorgeschlagene Subselect sehe ich nicht unbedingt als die Lösung (des vermuteten strukturellen Problems) an. Mit diesem kannst du jedoch zumindest genauer als mit dem DISTINCT spezifizieren, welchen der 6 Datensätze es liefern soll (WHERE, ORDER BY, LIMIT wären die einschränkenden Kandidaten).
Lo!
Bitte zitiere in der hier üblichen Weise und nicht Full-Qoute mit Text drunter. Danke.
Entschuldige bitte. In anderen Foren ist es meist unhöflich Beiträge des anderen zu "zerlegen", darum tue ich das normal nicht.
Aber ich werde versuchen, mich hier anzupassen.
Warum auch immer deine Datenstruktur so aufgebaut ist, dass bei dieser Abfrage mehrere Datensätze in der anderen Tabelle gefunden werden, DISTINCT ist nicht die beste Lösung. Denn dieses nimmt sich irgendeinen Datensatz. Das Ergebnis aus der dritten Tabelle ist damit ein zufälliges. Wenn das aufgrund deiner Daten doch stets das selbe ergibt, dann machst du was verkehrt. Um da was konkret besseres vorschlagen zu können, müsste man Bedeutung der Felder und ihre Zusammenhänge kennen.
Gerade habe ich einen elendslangen Beitrag geschrieben um die Tabellenfelder, die Zusammnhänge etc. zu erklären. Und während ich das aufgeschrieben und rekonstruiert habe, fiel mir auf, dass
tbl_netzwerk AS t2 ON t2.standort = t1.dose
eigentlich
tbl_netzwerk AS t2 ON t2.dose = t1.dose
lauten sollte.
Also wieder mal ein reiner Dummheitsfehler. Sorry.
Danke für die Hilfe aller Beteiligten!
Gruß
Daniel
Hello,
Ich habe folgende SQL-Abfrage:
SELECT t1.id AS pc_id, t1.requester AS pc_requester, t1.serial AS pc_serial, t1.anlagennr AS pc_anlagennr, t1.dose AS pc_dose, t3.ort AS standort_ort FROM tbl_pc AS t1 LEFT JOIN tbl_netzwerk AS t2 ON t2.standort = t1.dose LEFT JOIN tbl_standort AS t3 ON t3.id = t2.standort WHERE t1.requester LIKE '%".$_POST['requester']."%' AND t1.serial LIKE '%".$_POST['serial']."%' AND t1.anlagennr LIKE '%".$_POST['anlagennr']."%' AND t1.skartiert = '0' AND t1.kostenstelle >= '".$ks_min."' AND t1.kostenstelle <= '".$ks_max."' AND t1.aktiv = '1' ORDER BY t1.requester ASC
Nur so nebenbei bemerkt:
Du nimmst doch aber nachher keine Post-Paramter ungeprüft in ein SQL-Satement auf?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>