Tabellen von einander ausschließen!

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabellen von einander ausschließen!

    Hi Leute!

    Ich habe mir zu meinem Problem mal den JOIN Beitrag von mrhappiness angesehen (http://www.php-resource.de/forum/sho...threadid=28292), aber leider klappt das nicht so wie ich gerne möchte.

    Ich habe 2 Tabellen, die über ne ID verknüpft sind. Nun möchte ich aus Tabelle 1 nur die Daten ausgeben, zu denen es in Tabelle 2 keine Einträge gibt.

    Da müsste eigentlich der Fall "alle zahlen auslesen, zu denen das quadrat nicht vorhanden ist" von dem JOIN Tut richtig angewandt sein, nur habe ich ungleiche Spaltennamen (t1.fragebogen_id & t2.auswertung_fragebogen):

    Code:
    SELECT
    	t1.fragebogen_id, t1.fragebogen_titel, t1.fragebogen_timestamp
    FROM
    	$tablename_frageboegen t1
    	LEFT JOIN $tablename_auswertungen t2 USING(t1.fragebogen_id)
    WHERE
    	t2.auswertung_benutzer != $benutzer_id_session
    Danke schon mal für eure Hilfe!

    Greetz Lukas

  • #2
    Original geschrieben von mrhappiness
    Code:
    # mit ON können auch spalten verglichen werden, deren namen nicht gleich sind
    # aber schon allein der übersichtlichkeit halber wären identische spaltennamen besser
    # sinnloses beispiel:
    SELECT
    	t1.zahl, t2.quadrat
    FROM
    	tabelle1 t1
    	INNER JOIN tabelle2 t2 ON t1.tab1_id = t2.tab2_id
    Alles klar?
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Original geschrieben von mrhappiness
      Alles klar?
      fast

      Achso, das ist eh so einfach mit ON lösbar. Keke, aber ich möchte ja die auslesen, zu denen es in Tabelle 2 noch keine Einträge gibt. Und mit

      ON t1.fragebogen_id != t2.auswertung_fragebogen

      funkt das leider nicht. Da bekomme ich keine Datensätze zurück, obwohl in Tabelle 2 noch kein einziger Eintrag vorhanden ist. Oder muss man das dann völlig anders lösen?

      Danke für deine Hilfe!!!

      Greetz Lukas

      Kommentar


      • #4
        Re: Tabellen von einander ausschließen!

        Hi, also die ID müsste schon in beiden Tabellen vergeben sein, sonst kannst du ja nicht verknüpfen. Wenn ich davon ausgehe, dass du über fragebogen_id verknüpfst:
        Original geschrieben von skalu
        Code:
        SELECT
        	t1.fragebogen_id, t1.fragebogen_titel, t1.fragebogen_timestamp
        FROM
        	$tablename_frageboegen t1
        	LEFT JOIN $tablename_auswertungen t2 USING(t1.fragebogen_id)
        WHERE
        	t2.auswertung_benutzer != $benutzer_id_session
        warum setzt du dann nicht noch 'ne zusätzliche Bedingung? Also dass das ganze dann folgendermaßen aussehen könnte:
        Code:
        SELECT
        	t1.fragebogen_id, t1.fragebogen_titel, t1.fragebogen_timestamp
        FROM
        	$tablename_frageboegen t1
        	LEFT JOIN $tablename_auswertungen t2 USING([COLOR=RED]fragebogen_id[/COLOR])
        WHERE
        	t2.auswertung_benutzer != $benutzer_id_session [COLOR=RED]AND t2.auswertung_fragebogen = NULL[/COLOR]
        Korrigier mich bitte, wenn ich falsch liege.

        Kommentar


        • #5
          @skalu

          Lass das ! weg.

          @richtsteiger
          ungleiche Spaltennamen (t1.fragebogen_id & t2.auswertung_fragebogen)
          solltest schon richtig lesen...
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Hi richtsteiger!

            Danke erstmal für deine Antwort!

            Also die Sache mit dem NULL funktioniert leider nicht. Ich habe jetzt mal für eine der Spalten NULL vergeben und frage dieses dann ab. Leider bekomme ich dann überhaupt keine Ergebnisse mehr zurück. Aber funktioniert das überhaupt, wenn ich noch keine Einträge in der 2. Tabelle habe? Dann gibt's ja gar keinen Eintrag > LEER > also auch kein NULL, oder?

            Nur zur Erklärung: Tabelle 1 enthält Fragebögen, Tabelle 2 die Auswertungen dazu. Ich will nun nur mehr die Fragebögen auslesen, zu denen es in Tabelle 2 noch keine Auswertung gibt.

            Es gibt 2 Fragebögen. Ist Fragebogen 2 bereits ausgefüllt, soll ich nur mehr Fragebogen 1 angebogen bekommen!

            Danke vielmals für deine Hilfe!

            Greetz Lukas

            Kommentar


            • #7
              @mrhappiness
              hab ich schon, ich meinte ja auch, wenn er schon verknüpfen will, dann sollte er doch auch in der zweiten Tabelle eine ID haben, über die er verknüpfen kann. Also wenn er in Tabelle 1 einen neuen Datensatz anlegt, dann legt er halt in Tabelle 2 einen neuen leeren Datensatz mit der ID an. Ist dann halt 'ne neue zusätzliche Spalte in Tabelle 2, aber er kann verknüpfen und kommt über die Bedingungen an seine Daten, die er haben will.

              Kommentar


              • #8
                @skalu
                na dann halt 0 oder einen Leerstring angeben. Ist ja nun abhängig von Spaltentyp (INT,VARCHAR) und Standard.

                Kommentar


                • #9
                  Original geschrieben von mrhappiness
                  Lass das ! weg.
                  @mrhappiness

                  Sorry, ich glaub ich versteh das nicht ganz Wenn ich einen INNER JOIN mit ON ... = ... mache, dann bekomme ich ja nur die Einträge, zu denen es in beiden Tabellen nen Eintrag gibt. Aber genau das will ich ja nicht. Ich möchte ja die bekommen, zu denen es in Tabelle 2 KEINEN Eintrag gibt!

                  Dann muss ich das ja anders ausschließen, oder?

                  @richtsteiger

                  Wie kann meine Spalte 0 oder ' ' sein, wenn kein Eintrag vorhanden ist? Dann gibt's ja keinen Datensatz !!!

                  Greetz Lukas

                  Kommentar


                  • #10
                    Hi, les mein Posting oben. Wenn du in Tabelle 2 eine neue Spalte fragebogen_id anlegst, sie als INDEX deklarierst und die fragebogen_id aus Tabelle 1 übernimmst, dann kannst du auch verknüpfen. Also so z.B.:
                    Tabellenstruktur von Tabelle1:
                    Code:
                    Spalten:
                    fragebogen_id
                    fragebogen_titel
                    fragebogen_timestamp
                    ...
                    Struktur Tabelle 2:
                    Code:
                    Spalten:
                    fragebogen_id
                    auswertung_benutzer
                    ...
                    Verstehst du, worauf ich hinaus will? Tabelle 2 ist dann nicht leer, sondern nur die Werte, die du für die Auswertung brauchst.

                    Kommentar


                    • #11
                      Original geschrieben von richtsteiger
                      @mrhappiness
                      hab ich schon, ich meinte ja auch, wenn er schon verknüpfen will, dann sollte er doch auch in der zweiten Tabelle eine ID haben, über die er verknüpfen kann.
                      Hat er doch, sie heißt nur anders...

                      @skalu
                      Code:
                      SELECT
                      	t1.fragebogen_id, t1.fragebogen_titel, t1.fragebogen_timestamp
                      FROM
                      	$tablename_frageboegen t1
                      	LEFT JOIN $tablename_auswertungen t2 
                                  ON t1.fragebogen_id = t2.auswertung_fragebogen
                      WHERE
                      	t2.auswertung_benutzer IS NULL
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        Ich habe 2 Tabellen, die über ne ID verknüpft sind. Nun möchte ich aus Tabelle 1 nur die Daten ausgeben, zu denen es in Tabelle 2 keine Einträge gibt.
                        @richtsteiger: Noch eine Spalte? Die Redundanz wird ihm nicht helfen.

                        SQL ist mengenorientiert und da wäre der intuitive Ansatz: "Baue die Menge derer aus Tabelle 1, die ein Pendant in Tabelle 2 haben. Gib mir nun die Menge der Tupel aus Tabelle 1, die nicht in der eben gebauten Menge sind."
                        Das ist das gleiche wie "Gib mir alle Tupel aus Tabelle 1, die kein Pendant in Tabelle 2 haben." Mengendifferenz eben.

                        Ich würde es also mal mit
                        SELECT * FROM tabelle1 WHERE id NOT IN(SELECT id FROM tabelle2)
                        versuchen.

                        Kommentar


                        • #13
                          @mrhappiness

                          Wunderbar danke! So funktioniert's! Vielen Dank für deine Geduld

                          @all

                          danke für eure Beiträge!

                          Greetz Lukas

                          Kommentar


                          • #14
                            Guten Morgen!

                            Ich habe leider noch ein Problem gefunden, das ich nicht in den Griff bekomme. Ich habe für dieses Fragebogen-Script auch Benutzer, damit jeder Benutzer nur 1x jeden Fragebogen ausfüllen darf. Leider funktioniert mein Query nicht völlig fehlerfrei:

                            2 Fragebögen: Fragebogen 1, Fragebogen 2.
                            2 Benutzer: Benutzer 1, Benutzer 2.

                            Hat Benutzer 1 nun Fragebogen 1 ausgefüllt, bekommt Benutzer 2 nur mehr den 2. Fragebogen angeboten, da ja bereits eine Auswertung von Fragebogen 1 existiert. Im Moment habe ich folgendes Query:

                            Code:
                            SELECT t1.fragebogen_id, t1.fragebogen_titel, t1.fragebogen_timestamp, COUNT(t2.frage_text) AS fragen_anzahl 
                            FROM feedback_frageboegen t1 
                            INNER JOIN feedback_fragen t2 ON t1.fragebogen_id = t2.frage_fragebogen 
                            LEFT JOIN feedback_auswertungen t3 ON t1.fragebogen_id = t3.auswertung_fragebogen 
                            WHERE 
                            t1.fragebogen_aktiv = 1 AND t2.frage_aktiv = 1 AND t3.auswertung_benutzer IS NULL 
                            GROUP BY 
                            t1.fragebogen_titel ORDER BY t1.fragebogen_timestamp ASC
                            Auch mit der WHERE Abfrage "t3.auswertung_benutzer != $benutzer_id_session" komme ich nicht zum gewünschten Ergebnis. Ich finde keine Möglichkeit, nur die Datensätze aus Tabelle 1 auszulesen, zu denen in Tabelle 2 kein Eintrag des aktuellen Benutzers ($benutzer_id_session) existiert!

                            Danke schon mal!

                            Greetz Lukas

                            Kommentar


                            • #15
                              So könnte es gehen:

                              Code:
                              SELECT 
                                    t1.fragebogen_id, t1.fragebogen_titel, t1.fragebogen_timestamp,
                                    COUNT(t2.frage_text) AS fragen_anzahl 
                              FROM 
                                    feedback_frageboegen t1 
                              INNER JOIN 
                                    feedback_fragen t2 ON t1.fragebogen_id = t2.frage_fragebogen 
                              LEFT JOIN 
                                    feedback_auswertungen t3 ON t1.fragebogen_id = t3.auswertung_fragebogen 
                              WHERE 
                                    t1.fragebogen_aktiv = 1 AND 
                                    t2.frage_aktiv = 1 AND 
                                    t3.auswertung_benutzer IS NULL 
                              GROUP BY 
                                    t1.fragebogen_titel 
                              HAVING
                                    COUNT(t3.auswertung_benutzer) = 0
                              ORDER BY 
                                    t1.fragebogen_timestamp ASC
                              Zuletzt geändert von xManUx; 29.06.2005, 08:44.

                              Es kommt nicht darauf an, mit dem Kopf durch den Monitor zu rennen,
                              sondern mit den Augen das Manual zu lesen.

                              Kommentar

                              Lädt...
                              X