Helmuth: Abfrage zweier Tabellen kombinieren und nach Datum sortieren

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

  1. 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

    1. Abfrage aller Anfragen; Ergebnis eingeschränkt auf die Zielspalten
    2. Abfrage aller Angebote mit Join in Angebote; Ergebnis eingeschränkt auf die Zielspalten
    3. UNION von (1) und (2)

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. 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

      1. 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

        --
        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
        1. 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

          1. 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

            --
            -------------------
            ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
            1. 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

              1. Hi,

                funktionieren die beiden Statements als einzelnes?

                MfG
                Rouven

                --
                -------------------
                ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
                1. 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

                  1. 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

              2. 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";

  2. 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