Abfrage zweier Tabellen kombinieren und nach Datum sortieren
Helmuth
- php
Hallo allerseits!
Ich suche jetzt schon länger eine Möglichkeit folgendes Problem zu lösen - und bin mittlerweile hoffnungslos überfordert. Ich hätte jetzt Join, Union oder aber arrays als Lösungsansatz - weiß aber weder welcher der beste ist noch wie es im Detail funktionieren soll. Ich muss dazusagen, dass ich mehr Designer als Programmierer bin und es daher durchaus sein kann, dass ich eine offensichtliche Lösungsmöglichkeit übersehe...
Ich verwend eine mysql 4.1 DB.
Also es gibt (vereinfacht) die Tabellen 'anfragen' und 'angebote' wobei die Tabelle angebote auf Anfragen aus der Tabelle 'anfragen' verweist.
anfragen:
anfrage_id | mitglied_id | betreff | anfrage_datum
angebote:
angebot_id | mitglied_id | anfrage_id | angebot_datum
Endergebnis soll eine nach Datum sortierte Liste für die vorhandene Mitglied-Id sein, also:
datum | betreff | typ (anfrage oder angebot)
ich muss also anfrage_datum und angebot_datum "mischen" und in die richtige Reihenfolge bringen und gleichzeitig bei den Angeboten den jeweiligen Betreff aus den Anfragen abfragen.
Hab ich das verständlich erklärt? Kann mir jemand helfen? Wie soll ich das machen?
Danke!
Helmuth
Hallo,
ich würde in dem Fall einen JOIN vorschlagen da du hier die Datenbank ihre eigentliche Lebensaufgabe vollführen lässt. Eine Überführung in PHP ist in meinen Augen sinnlos.
Einführung Joins
Fortgeschrittene Joins
Mit den beiden Artikel solltest du mal grundsätzlich in die richtige Richtung kommen.
Eine Frage hätte ich schon noch: Angebot und Anfrage sind verknüpft, im Ergebnis willst du aber keine Verknüpfung sondern zwei Zeilen oder wie oder was?
Wenn ja, müsste das irgendwas sein wie
MfG
Rouven
Hallo!
Danke für deine Hilfe.
Ja bei diesem Ergebnis steht die Zeit im Vordergrund, es soll quasi die Historie der von diesem User durchgeführten Aktionen sein.
also
23.01.2006 | Meine Anfrage 3 | Anfrage
22.01.2006 | Mein Angebot für eine fremde Anfrage | Angebot
21.01.2006 | Meine Anfrage 2 | Anfrage
18.01.2006 | Meine Anfrage 1 | Anfrage
Anfragen auf die in 'angebote' verwiesen wird sind ja nicht die eigenen. Also man stellt eine Anfrage, die Angebote kommmen von anderen Usern.
Ich werd mal deine Artikel lesen und mich notfalls nochmals melden.
lg,
Helmuth
Hallo nochmal,
23.01.2006 | Meine Anfrage 3 | Anfrage
22.01.2006 | Mein Angebot für eine fremde Anfrage | Angebot
21.01.2006 | Meine Anfrage 2 | Anfrage
18.01.2006 | Meine Anfrage 1 | Anfrage
Das Ergebnis müsste sich aber auf dem von mir beschriebenen Weg mit dem UNION erzielen lassen. Als 3. Spalte setzt du bei dem ersten Teil einfach den konstanten Wert 'Anfrage' AS typ und beim anderen 'Angebot' AS typ.
MfG
Rouven
Guten Morgen!
Ich komm hier leider nicht weiter. Vermutlich bin ich doch zu sehr Designer um das zu checken :o(
Nachdem ich mir JOIN und UNION angeschaut habe, dachte ich, dass die Abfrage ungefähr (ungefähr weil ich die Abfrage jetzt schon mehrmals verändert habe und keine Ahnung habe was sie am "richtigsten" war...) so aussehen sollte:
(SELECT betreff, anfragedatum AS datum
FROM anfragen
WHERE mitglied_id = $session[id])
UNION
(SELECT anfrage_id, betreff, angebotdatum AS datum
FROM angebote
INNER JOIN anfragen
ON angebote.anfrage_id = anfragen.anfrage_id
WHERE mitglied_id = $session[id])
Vielleicht könnt sich jemand erbarmen und die Abfrage so umschreiben, dass sie mit den oben gennanten Angaben zum gewünschten Ergebnis führt?!
Vielen Dank!
lg,
Helmuth
Morgen!
Ilja hat dir die Lösung eigentlich schon fertig geliefert, bis auf die WHERE-Bedingungen halt.
Deine Abfrage hat eigentlich nur das Problem, dass im UNION zwei unterschiedliche Spaltenzahlen vorliegen und du nicht mehr erkennen kannst ob das ein Angebot oder eine Anfrage war:
(SELECT anfrage_id, betreff, anfragedatum AS datum, 'Anfrage' AS t
FROM anfragen
WHERE mitglied_id = $session[id])
UNION
(SELECT anfrage_id, betreff, angebotdatum AS datum, 'Angebot' AS t
FROM angebote
INNER JOIN anfragen
ON angebote.anfrage_id = anfragen.anfrage_id
WHERE mitglied_id = $session[id])
Ob die Logik (Zuordnung Anfrage->Angebot) stimmt kann ich nicht sagen, das muss ich deinem Original überlassen...
MfG
Rouven
Danke euch beiden für eure Mühe.
Ich glaub ich werds einfach sein lassen. Ich bekomme immer eine Fehlermeldung und weiß nicht woran es liegt :o( Ich hab bei deiner Abfrage nur das bizgap_ vor die Tabellennamen gesetzt... Die Feldbezeichnungen stimmen alle.
SQL-Befehl:
(
SELECT anfrage_id, betreff, anfragedatum AS datum, 'Anfrage' AS t
FROM bizgap_anfragen
WHERE mitglied_id =5
)
UNION (
SELECT anfrage_id, betreff, angebotdatum AS datum, 'Angebot' AS t
FROM bizgap_angebote
INNER JOIN bizgap_anfragen ON bizgap_angebote.anfrage_id = bizgap_anfragen.anfrage_id
WHERE mitglied_id =5
)
LIMIT 0 , 30
MySQL meldet:
#1064 - You have an error in your SQL syntax near '( SELECT anfrage_id , betreff , anfragedatum AS datum , 'Anfrage' AS t FROM bizg' at line 1
*ratlos*
Helmuth
Hi,
funktionieren die beiden Statements als einzelnes?
MfG
Rouven
Hello,
jeppeeee funktioniert jetzt! Ich musste beim zweiten Select anfrage_id und mitglied_id um den tabellennamen erweitern.
Jetzt muss ich nur noch rausfinden wo das ORDER BY hinkommt damit es für alle Daten gilt...
Herzlichen Dank!
Helmuth
Endergebnis:
SQL-Befehl:
(
SELECT anfrage_id, betreff, anfragedatum AS datum, 'Anfrage' AS t
FROM bizgap_anfragen
WHERE mitglied_id =5
)
UNION (
SELECT bizgap_angebote.anfrage_id, betreff, angebotdatum AS datum, 'Angebot' AS t
FROM bizgap_angebote
INNER JOIN bizgap_anfragen ON bizgap_angebote.anfrage_id = bizgap_anfragen.anfrage_id
WHERE bizgap_angebote.mitglied_id =5
)
ORDER BY datum DESC
Danke nochmals!
lg,
Helmuth
echo $begrüßung;
SQL-Befehl:
(SELECT anfrage_id, betreff, anfragedatum AS datum, 'Anfrage' AS t
FROM bizgap_anfragen
[...]
#1064 - You have an error in your SQL syntax near '( SELECT anfrage_id , betreff , anfragedatum AS datum , 'Anfrage' AS t FROM bizg' at line 1
Der obige Befehl sieht richtig aus. Die Fehlermeldung setzt ja schon an der ersten öffnenden Klammer an. Da ist bestimmt was anderes faul. Lass doch mal die Bytes des SQL-Statements anzeigen, ob da irgendwas ungewöhnliches drinsteht:
echo '<pre>', chunk_split(chunk_split(bin2hex($sql), 2, ' '), 48);
Eine ASCII-Tabelle hilft beim Lesen der Bytewerte.
echo "$verabschiedung $name";
yo,
ich gebe zu, ich bin wirklich langsam im begreifen, aber das ist wieder so ein problem, wo ich es lese und nachher genauso dumm bin wie vorher. ;-)
spass beseite, ich habe dein problem wirklich noch nicht so ganz auffassen können. wenn ich das richtig verstanden habe, dann kann ein mitglied eine anfrage erstellen und mehrere angebote von unterschiedlichen mitgliedern erhalten. jetzt wo ich es schreibe, wird mir auch klarer, was du willst.....
(
SELECT mitglied_id, betreff, anfrage_datum, 'Anfrage'
FROM anfragen
)
UNION
(
SELECT ag.mitglied_id, af.betreff, ag.angebot.datum, 'Angebot'
FROM angebote AS ag, anfragen AS af
WHERE af.id = ag.anfrage-id
)
ORDER BY 1,3
damit bekommst du wür jedes mitglied die angebote, bzw. anfragen sortiert nach datum. wenn du es nur für eine bestimmte mitglied_id willst, dann einfach eine WHERE klausel bilden und entsprechend setzen.
Ilja