Join

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

  • #16
    Nach Deinen Angaben habe ich nun folgenden CODE, der leider auch nicht funktioniert.

    PHP-Code:
    $abfrage_content mysql_query ("SELECT t0.content, t0.id, t0.update_time, t0.status, t0.sprache
    FROM 
    $tab_content t0 
    LEFT JOIN 
    $tab_content t1 on USING (id) and t1.update_time <= '$datum_jetzt'  limit 1 
    WHERE t0.content LIKE '%
    $search%' && t0.update_time <= '$datum_jetzt' && t0.sprache = '$default_sprache'  order by update_time "); 

    Kommentar


    • #17
      Hallo sepp,

      das Problem ist immer noch dasselbe: Du musst entweder using nehmen (und nichts anderes) oder du nimmst on und kannst dann mehrere Bedingungen mit and oder or verknüpfen.

      Gruß,

      Anja
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #18
        So habe ich es nun auch versucht,,,,ich habe verschiedenes ausgetestet leider immer mit dem selben Resultat... ;-(

        PHP-Code:
        $abfrage_content mysql_query ("SELECT t0.content, t0.id, t0.update_time, t0.status, t0.sprache 
        FROM 
        $tab_content t0  
        LEFT JOIN 
        $tab_content t1 on(id) and t1.update_time <= '$datum_jetzt' and limit 1  
        WHERE t0.content LIKE '%
        $search%' && t0.update_time <= '$datum_jetzt' && t0.sprache = '$default_sprache'  order by update_time "); 

        Kommentar


        • #19
          Jetzt benutzt du ON genau so wie du vorhin USING benutzt hast. Wenn es dasselbe wäre, würde es ja nicht verschieden heißen. Versuchs doch mal mit
          Code:
          ...
          FROM tabelle1
          JOIN tabelle2 on tabelle1.spalte1 = tabelle2.spalte2 and tabelle2.spalte3 = 'irgendwas'
          dein
          Code:
          and limit 1
          muss da auch weg. Du solltest dich noch etwas mehr mit der Syntax beschäftigen. Es sieht so aus, als ob du dir da dein eigenes Zeug ausdenkst, was aber leider so nicht geht.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #20
            Du meinst So

            PHP-Code:
            FROM $tab_content t0  
            LEFT JOIN $tab_content t1 on  t0
            .id t1.id  and t1.update_time <= '$datum_jetzt' and limit 1
            WHERE t0
            .content LIKE '%$search%' && t0.update_time <= '$datum_jetzt' && t0.sprache '$default_sprache'  order by update_time "); 
            Da bekomme ich aber immernoch einen Fehler...ohne Limit gehts aber mit viel zu vielen Ergebnissen

            Das Problem ist; ich will nur die Zeilen durchsuchen welche am nächsten beim aktuellen Datum liegen pro id

            Kommentar


            • #21
              Wie gesagt, das LIMIT darf dort nicht hin, wenn dann kommt es ganz zum Schluss.
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #22
                aber wenn ich es zum Schluss mache gibt er mir nur ein reslutat....ich will aber alle Resultate welchen pro id das neuste Datum haben

                Kommentar


                • #23
                  Ok, jetzt hab ich es verstanden. Das ist eine der trickreichsten Abfragearten.

                  Du brauchst also den Datensatz mit dem größtmöglichen Wert des Feldes update_time, der aber kleiner sein muss, als das heutige Datum.

                  (Die Frage die sich mir an dieser Stelle stellt: gibt es auch geplante Updates, die in der Zukunft liegen oder reicht es auch aus, einfach das Maximum zu nehmen, weil keins größer sein kann als heute?)

                  Dazu musst du die Tabelle zunächst mit sich selbst LEFT JOINen, was eigentlich schon der Trick ist. Du verwendest dabei einen kleiner-als-Vergleich und nimmst dann den Datensatz, der diesen nicht mehr erfüllen kann. Durch den LEFT JOIN ist der rechte Teil dann komplett NULL und das stellen wir in der WHERE-Klausel als Bedingung fest. Wenn das nämlich passiert, also t1.datum < t2.datum nicht mehr erfüllbar ist, dann ist t1.datum das Maximum:

                  Code:
                  SELECT ...
                  FROM dieTabelle AS t1
                  LEFT JOIN dieTabelle AS t2 ON t1.datum < t2.datum
                  WHERE t2.irgendeineSpalte IS NULL
                  Zuletzt geändert von AmicaNoctis; 31.07.2009, 02:13.
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #24
                    zu Deiner Frage: Ja, es gibt auch content in der zukunft aber die sollen nicht beücksichtigt werden.

                    Zum Code: Das ist mir zur Zeit zu schwer zum interpretieren, ist schon spät! Mal sehen ob ich das noch auf die Reihe kriege?

                    Kommentar


                    • #25
                      Sorry, hab noch einen Nachtrag zu "WHERE t2.irgendeineSpalte IS NULL": Mit irgendeineSpalte meine ich eine, die als NOT NULL deklariert ist. Nur so kannst du sicherstellen, dass die rechte Seite des JOINs aufgrund des gescheiterten Vergleichs in der ON-Klausel NULL ist und nicht zufällig, weil es einen Datensatz gibt, der in dieser Spalte wirklich NULL ist.

                      Wenn es auch welche in der Zukunft gibt, wird es noch ein Stück komplizierter und da kommt man um Subselects nicht mehr herum.

                      EDIT: Das war ne sehr schöne Knobelaufgabe und ich nehme das eben gesagte zurück: Es geht auch ohne Subselects:

                      Code:
                      SELECT ...
                      FROM tabelle as t1
                      LEFT JOIN tabelle AS t2 ON (t1.datum < t2.datum AND t2.datum <= now()) OR t1.datum > now()
                      WHERE t2.eineNotNullSpalte IS NULL;
                      Die Datumsspalte sollte dabei unbedingt einen Index bekommen, damit das alles auch schön flott geht.

                      Falls du lieber mit Hash Indizes arbeitest: in diesem Falle unbedingt BTree verwenden! Falls dir das grad nichts sagt, auch nicht schlimm, standardmäßig wird immer BTree verwendet.
                      Zuletzt geändert von AmicaNoctis; 31.07.2009, 03:08.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar

                      Lädt...
                      X