MYSQL: JOINS
Matt
- datenbank
Hallo,
ich verstehe das Thema mit den JOINS nicht so ganz.
Ich habe eine 2 Tabellen von welchen momentan so abgerufen wird:
$abfrage = 'SELECT *
FROM ad_small DB1, customer DB2
WHERE DB1.cid=DB2.id AND DB1.issue='.$_GET['whatissue'].'
ORDER BY DB1.time
DESC';
Das funktioniert auch wunderbar. Nun gibt es noch eine andere Tabelle 'DB3', welche das ganze JOINen (also zur bestehenden Abfrage dazu) soll.
Dort muss 'type'=2 sein und 'issue'=$_GET['whatissue']
Ist dies der Fall, muss die 'adid' dieser Tabelle (DB3) wiederrum von ad_small (DB1) alle Daten abfragen.
Momentan habe ich 2 Abfragen untereinander stehen. Jedoch würde ich das ganze gerne in eine Abfrage packen. Wie sieht so etwas mit JOINS aus? Ist das überhaupt möglich. Ich kann an der Struktur der Tabellen leider nichts ändern.
Herzlichen Dank.
Hello,
helfen dir vielleicht die SELFHTML:Datenbanken-Artikel weiter, insbesondere Fortgeschrittene Jointechniken von Vinzenz Mai?
MfG
Rouven
Danke,
das habe ich mir nun zu Gemüte geführt, allerdings kam explizit mein Vorgang nicht 'direkt' vor.
Vielleicht kann mir jemand helfen?
Das bisherige umgeformte SQL sieht so aus:
$abfrage = "SELECT *
FROM ad_small
INNER JOIN customer
ON customer.id = ad_small.cid AND ad_small.issue='0408'
ORDER BY ad_small.time
DESC";
Das liefert mir das selbe Ergebnis wie mein SQL im 1. Post. Nun dachte ich mein Problem könnte ich so lösen
allerdings klappt es nicht (Fehler in SQL_SYNTAX).
$abfrage = "SELECT *
FROM
(ad_small INNER JOIN bill_part ON ad_small.id = bill_part.adid WHERE bill_part.type='2' AND bill_part.issue='0408')
INNER JOIN customer
ON customer.id = ad_small.cid AND ad_small.issue='0408'
ORDER BY ad_small.time
DESC";
Hello,
allerdings klappt es nicht (Fehler in SQL_SYNTAX).
ohne Zweifel.
$abfrage = "SELECT *
FROM
(ad_small INNER JOIN bill_part ON ad_small.id = bill_part.adid WHERE bill_part.type='2' AND bill_part.issue='0408')
hier ist "kein" SELECT, also gibts hier kein WHERE. Wenn die Kriterien da hin sollen, musst du sie, wie du es unten tust, als Teil der ON-Klausel unterbringen. Alternativ (1) bringst du sie ans Ende vor das ORDER BY, oder (2) verwendest du SUBSELECTs, je nachdem was für eine Version von MySQL du nutzt.
INNER JOIN customer
ON customer.id = ad_small.cid AND ad_small.issue='0408'
ORDER BY ad_small.time
DESC";
Wenn du nach der Lösung des Syntaxfehlers noch nicht weiter bist, dann poste bitte beispielhafte Tabelleninhalte und das gewünschte Ergebnis.
MfG
Rouven
Wenn du nach der Lösung des Syntaxfehlers noch nicht weiter bist, dann poste bitte beispielhafte Tabelleninhalte und das gewünschte Ergebnis.
Die Lösung gibt es nicht wirklich, weil ich nicht auf das Ergebnis komme das ich gerne hätte.
Meine Tabellenstruktur:
ad_small:
id, cid (=customer.id), issue, text
customer:
id, prename, lastname
bill_part:
id, issue, adid (=ad_small.id)
Jetzt soll er mir alle Daten von ad_small abrufen, bei denen issue = '0408' ist. Zusätzlich soll er von bill_part die adid, bei denen issue='0408', abrufen und in ad_small wiederrum die Daten mit der jeweiligen adid abrufen.
Dies habe ich momentan noch mit 2 Selects gelöst und würde dies nun gerne mit JOINs lösen.
customer:
id, prename, lastname
Ich vergaß Customer zu erwähnen.
ad_small hat ein Feld cid (= customer.id). Vom jeweiligen customer sollen auch alle Inhalte/Daten den Abruf 'joinen'.
SELECT *
FROM ad_small
INNER JOIN customer
ON customer.id = ad_small.cid AND ad_small.issue='0408'
ORDER BY ad_small.time
DESC
Das hat bisher mein Ergebnis ausgeführt, allerdings ohne die JOINs von bill_part.
Ich habs gelöst ;-)
Wahnsinn... hab grad nochmal den Teil der Dokumentation (den Link den du mir gabst) gelesen und gesehen wie wichtig es ist, die Tabellen in der richtigen Reihenfolge abzufragen.
SELECT * FROM bill_part
INNER JOIN (ad_small INNER JOIN customer ON ad_small.cid = customer.id)
ON bill_part.adid = ad_small.id
WHERE bill_part.issue='042008' AND bill_part.type='2'
liefert mir das gewünschte Ergebnis.
Danke für deine Hilfe, Rouven.
Salvete,
$abfrage = 'SELECT *
FROM ad_small DB1, customer DB2
WHERE DB1.cid=DB2.id AND DB1.issue='.$_GET['whatissue'].'
---------------------------------------------^
ORDER BY DB1.time
DESC';
Und bitt immer daran denken Parameter _vor_ dem Gebrauch zu ueberpruefen:
http://www.google.de/search?num=20&hl=de&q=php+mysql+get+parameter+sicherheit&btnG=Suche&meta=lr%3Dlang_de
MfG,
Sympatisant