Ankündigung

Einklappen
Keine Ankündigung bisher.

Cross join

Einklappen

Neue Werbung 2019

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

  • Cross join

    hallo,

    habe zwei Tabellen, Tabelle [A]= tbl_info_point und Tabelle [B] tbl_debug.

    Wenn jetzt in Tabelle [A] ein Datensatz gelesen und bestätigt wird, wird in Tabelle [B] ein Eintrag erzeugt, dass der Datensatz gelesen wurde. (Mit Username und Datensatz ID aus Tabelle [A])

    Jetzt soll in Tabelle [A] durch ein Icon signalisiert werden, Datensatz gelesen.

    Wie muss die SQL Abfrage aussehen? Hier mein Beispiel ohne Funktion:

    Code:
     $daten = array();
     $sql = "SELECT tbl_info_point.id, tbl_info_point.timestamp, tbl_info_point.user, tbl_info_point.name, tbl_info_point.color, tbl_info_point.meldung, tbl_info_point.datetime,
                    tbl_info_point.lebenszeit, tbl_info_point.lebenszeit_timestamp, tbl_info_point.zustand, tbl_info_point.radio1,
                    tbl_info_point.background, tbl_info_point.anzeige, tbl_info_point.anzeige_1, tbl_debug.button
                    FROM tbl_info_point    
                    CROSS JOIN tbl_debug    
                    GROUP BY tbl_info_point.id
                    ORDER BY tbl_info_point.id DESC";
     if ($erg = $link->query($sql)) {
         if ($erg->num_rows) {
            $ds_gesamt = $erg->num_rows;
            $erg->free();
        }
        if ($erg = $link->query($sql)) {
            while ($datensatz = $erg->fetch_object()) {
                $daten[] = $datensatz;
            }
        }
    }
    PHP-Code:
      if ($inhalt->id == $inhalt->button) { echo "<img src='gelesen.png'>" ; } 

  • #2
    Ja, vielleicht sogar mehrfach.


    (vielleicht habe ich ja was verpasst und andere wissen worum es geht)

    Kommentar


    • #3
      Jetzt soll in Tabelle [A] durch ein Icon signalisiert werden, Datensatz gelesen.
      Das klingt komisch... ein Icon in der Datenbank soll etwas signalisieren? Du meinst doch eher, die Anzeige im Browser soll irgendwo ein Icon bekommen, oder?

      Und um Himmels willen keinen Crossjoin - diese Abfrage macht keinen Sinn, ausser das sie potentiell massig Daten sammelt und wieder verdampft... hinzu kommt erschwerend, das du keine WHERE Bedingung benutzt. Sowas nennt man ein Killer-Query, sobald das auf eine größere Datenmenge angewendet wird, stirbt dein Script u.U. am Speichermangel.
      Für den Check musst du nur einen Datensatz in B finden, passend für Username und ID...
      Wenn es eine Übersicht werden soll, dann joined man, aber dann bitte LEFT JOIN und entweder mit einer WHERE Bedingung oder mit LIMIT/OFFSET..
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Zitat von lstegelitz Beitrag anzeigen
        Das klingt komisch... ein Icon in der Datenbank soll etwas signalisieren? Du meinst doch eher, die Anzeige im Browser soll irgendwo ein Icon bekommen, oder?

        Und um Himmels willen keinen Crossjoin - diese Abfrage macht keinen Sinn, ausser das sie potentiell massig Daten sammelt und wieder verdampft... hinzu kommt erschwerend, das du keine WHERE Bedingung benutzt. Sowas nennt man ein Killer-Query, sobald das auf eine größere Datenmenge angewendet wird, stirbt dein Script u.U. am Speichermangel.
        Für den Check musst du nur einen Datensatz in B finden, passend für Username und ID...
        Wenn es eine Übersicht werden soll, dann joined man, aber dann bitte LEFT JOIN und entweder mit einer WHERE Bedingung oder mit LIMIT/OFFSET..
        Oh... dann lassen wir das mal besser! Danke für diesen Hinweis!!


        Was für eine WHERE Bedingung soll ich nehmen, wenn man alle Daten anzeigen möchte.
        Es geht ja um eine zusätzliche Info aus einer anderen Tabelle, ob Datensatz gelesen oder nicht.

        Bei einer LEFT JOIN Beziehung muss eine WHERE Bedingung gesetzt werden oder?

        Danke für Deine Hilfe

        Kommentar


        • #5
          Naheliegenderweise nimmst du ein
          Code:
          SELECT <spalten> FROM tbl_info_point
          LEFT JOIN tbl_debug ON tbl_debug.(Datensatz ID)=tbl_info_point.id
          GROUP BY tbl_info_point.id
          ORDER BY tbl_info_point.id DESC
          durch die Join-On Klausel verhinderst du, dass das vollständige Kreuzprodukt aus beiden Tabellen gebildet wird
          "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

          Kommentar


          • #6
            Zitat von eagle275 Beitrag anzeigen
            Naheliegenderweise nimmst du ein
            Code:
            SELECT <spalten> FROM tbl_info_point
            LEFT JOIN tbl_debug ON tbl_debug.(Datensatz ID)=tbl_info_point.id
            GROUP BY tbl_info_point.id
            ORDER BY tbl_info_point.id DESC
            durch die Join-On Klausel verhinderst du, dass das vollständige Kreuzprodukt aus beiden Tabellen gebildet wird
            Super vielen Dank

            Code:
             
             LEFT JOIN tbl_debug ON tbl_debug.button=tbl_info_point.id AND tbl_debug.email=".$name."
            Ist eine Variable im SQL Code erlaubt? Muss ich in meinem Beispiel noch Klammern setzen AND ??

            Kommentar


            • #7
              Die Variable ist PHP, der SQL Code. ist der daraus Resultierende(weil der Text mit Punkt verbunden wird), aber ja kann man machen, wenn man die vorher maskiert oder besser noch prepared statements verwendet.

              Kommentar


              • #8
                Zitat von eagle275 Beitrag anzeigen
                Naheliegenderweise nimmst du ein
                Code:
                SELECT <spalten> FROM tbl_info_point
                LEFT JOIN tbl_debug ON tbl_debug.(Datensatz ID)=tbl_info_point.id
                GROUP BY tbl_info_point.id
                ORDER BY tbl_info_point.id DESC
                durch die Join-On Klausel verhinderst du, dass das vollständige Kreuzprodukt aus beiden Tabellen gebildet wird
                Ist sowas auch zulässig?
                Code:
                LEFT JOIN tbl_debug ON tbl_debug.email LIKE 'test@test.com'

                Kommentar


                • #9
                  Eine JOIN-Condition (also das, was nach dem ON steht) definiert, wie die Tabellen zusammengehören.

                  Ist Deine Frage damit beantwortet?
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    blackfire
                    https://www.datenbanken-verstehen.de...ial/sql-joins/

                    Kommentar


                    • #11
                      super genau so habe ich es versucht!

                      Code:
                       $sql = "SELECT tbl_info_point.id, tbl_info_point.timestamp, tbl_info_point.user, tbl_info_point.name, tbl_info_point.color, tbl_info_point.meldung, tbl_info_point.datetime,
                                      tbl_info_point.lebenszeit, tbl_info_point.lebenszeit_timestamp, tbl_info_point.zustand, tbl_info_point.radio1,
                                      tbl_info_point.background, tbl_info_point.anzeige, tbl_info_point.anzeige_1, tbl_debug.button
                                      FROM tbl_info_point    
                                      LEFT JOIN tbl_debug ON tbl_debug.button=tbl_info_point.id
                                      WHERE tbl_debug.email = ".$userRow['username']."  // hier ist der Wurm drin????
                                      GROUP BY tbl_info_point.id
                                      ORDER BY tbl_info_point.id DESC";

                      Kommentar


                      • #12
                        Im GROUP BY müssen alle Spalten angeführt werden, die auch im SELECT stehen.

                        Kommentar


                        • #13
                          So geht es jetzt...

                          Code:
                          $sql = "SELECT tbl_info_point.id, tbl_info_point.timestamp, tbl_info_point.user, tbl_info_point.name, tbl_info_point.color, tbl_info_point.meldung, tbl_info_point.datetime,
                                          tbl_info_point.lebenszeit, tbl_info_point.lebenszeit_timestamp, tbl_info_point.zustand, tbl_info_point.radio1,
                                          tbl_info_point.background, tbl_info_point.anzeige, tbl_info_point.anzeige_1, tbl_debug.button
                                          FROM tbl_info_point    
                                          LEFT JOIN tbl_debug ON tbl_debug.button=tbl_info_point.id
                                          WHERE tbl_debug.email IS NOT NULL or tbl_debug.email IS NULL
                                          GROUP BY tbl_info_point.id
                                          ORDER BY tbl_info_point.id DESC";

                          Kommentar


                          • #14
                            Zitat von blackfire Beitrag anzeigen
                            So geht es jetzt...

                            Code:
                            $sql = "SELECT tbl_info_point.id, tbl_info_point.timestamp, tbl_info_point.user, tbl_info_point.name, tbl_info_point.color, tbl_info_point.meldung, tbl_info_point.datetime,
                            tbl_info_point.lebenszeit, tbl_info_point.lebenszeit_timestamp, tbl_info_point.zustand, tbl_info_point.radio1,
                            tbl_info_point.background, tbl_info_point.anzeige, tbl_info_point.anzeige_1, tbl_debug.button
                            FROM tbl_info_point
                            LEFT JOIN tbl_debug ON tbl_debug.button=tbl_info_point.id
                            WHERE tbl_debug.email IS NOT NULL or tbl_debug.email IS NULL
                            GROUP BY tbl_info_point.id
                            ORDER BY tbl_info_point.id DESC";
                            Schade, ist doch quatsch!

                            jetzt hat jeder User eine Lesebestätigung

                            Ich verstehe es einfach nicht, dass tbl_debug.email =".$email." nicht geht ??

                            Code:
                             
                             WHERE tbl_debug.email IS NOT NULL or tbl_debug.email IS NULL

                            Kommentar


                            • #15
                              WHERE tbl_debug.email IS NOT NULL or tbl_debug.email IS NULL

                              ergibt überhaupt keinen Sinn. Sprich das doch mal laut aus: Wo die E-Mail nicht leer ist oder wo die E-Mail leer ist. Also überall. Du kannst das komplette WHERE weglassen, und dein Code tut das gleiche.

                              Warum sind die Tabellen so komisch mit tbl_ benannt? Das macht alles nur schwerer lesbar.
                              Warum so ein komischer Englisch/Deutsch-Mischmasch? color, anzeige, anzeige_1, background, lebenszeit? Kann man sich nicht auf eine Sprache einigen? Wenn du noch Fanzösisch und Spanisch rein wirfst, kannst du es noch schwerer verständlicher machen, falls das dein Ziel ist.

                              Warum steht in einer Spallte "button" eine info_point.id? Das ergibt doch logisch überhaupt keinen Sinn. Wer denkt sich sowas aus?

                              Und meinen Hinweis mit GROUP BY hast du dezent ignoriert. Ignoranz wird dich nicht weiter bringen. Eher im Gegenteil.

                              Kommentar

                              Lädt...
                              X