Tina: SQL Problem / LEFT JOIN

Hallo,

ich habe Problem mit folgende SQL Befehl:

SELECT * FROM $db_table
      LEFT JOIN menu ON content.ID = menu.link
      LEFT JOIN submenu ON content.ID = submenu.link
      WHERE TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%' OR BESCHREIBUNG LIKE '%$txt_suchbegriff%'

Nun möchte ich das ganze erweitern und zwar sollen nur die angezeigt werden in menu und submenu sitemap_deaktiviert auf 1 steht.

menu.sitemap_deaktiviert ='1' OR submenu.sitemap_deaktiviert ='1'

Ich dachte mir das kann ja nicht so schwer sein und habe es so gelöst aber mit der Lösung ändert sich gar nicht!???

SELECT * FROM $db_table
      LEFT JOIN menu ON content.ID = menu.link
      LEFT JOIN submenu ON content.ID = submenu.link
      WHERE TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%' OR BESCHREIBUNG LIKE '%$txt_suchbegriff%' AND WHERE menu.sitemap_deaktiviert ='1' OR submenu.sitemap_deaktiviert ='1'

Was mache ich hier falsch?

Gruß Tina

  1. Hi,

    Du machst folgendes falsch:
    Du versuchst vermutlich einen String '1' mit Zahl 1 zu vergleichen.
    Wenn die Spalte Number ist, dann lass beim vergleichen das '' weg oder vergleiche mit LIKE.

    Gruss Matze

    1. Du versuchst vermutlich einen String '1' mit Zahl 1 zu vergleichen.

      hi

      die Spalte sitemap_deaktiviert habe ich mit int defeniert.
      Aber wenn ich es ohne '' schreibe kommt trotzdem das selbe ergebnis!

      Das heißt ich möchte als zusätzlichen Filter abfragen ob sitmap_deaktiviert ist und somit die Auswahl verkleinern wenn es deaktiviert ist.

      gruss tina

      1. Hi,

        soweit sind wir schon mal auf dem richtigen Weg.

        In dem Fall musst Du nun mit = 1 vergleichen.
        Schauen wir mal Deine Abfrage an:

        SELECT * FROM $db_table
              LEFT JOIN menu ON content.ID = menu.link
              LEFT JOIN submenu ON content.ID = submenu.link
              WHERE TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%' OR BESCHREIBUNG LIKE '%$txt_suchbegriff%' AND (menu.sitemap_deaktiviert =1 OR submenu.sitemap_deaktiviert =1)

        (WHERE menu.sitemap_deaktiviert ='1' OR submenu.sitemap_deaktiviert ='1')

        Was mache ich hier falsch?

        Setz die Abfrage nach AND noch in Klammern, dann sollte es klappen, dann muss entweder submenu.sitemap_deaktiviert =1 erfüllt sein oder
        menu.sitemap_deaktiviert =1

        Ausserdem war das where nach dem AND unnötig.
        Gruss Matze

        1. SELECT * FROM $db_table
                LEFT JOIN menu ON content.ID = menu.link
                LEFT JOIN submenu ON content.ID = submenu.link
                WHERE TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%' OR BESCHREIBUNG LIKE '%$txt_suchbegriff%' AND (menu.sitemap_deaktiviert =1 OR submenu.sitemap_deaktiviert =1)

          Hi Matze

          das war immer noch nicht die Lösung auch wenn es logisch aussieht.
          Es wird immer noch alles ausggeben als ob nichts gewesen wäre...

          Das muß noch weiter verschachtelt sein. Lass mich mal überlgen.

          Ich muß von dem Ergebnis des Suchbegiffes nochmals abfragen ob es deaktiviert ist

          so nun habe ich mal was anderes probiert aber das ist auch falsch!!

          SELECT * FROM content
                LEFT JOIN menu ON content.ID = menu.link
                LEFT JOIN submenu ON content.ID = submenu.link
                WHERE TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%' OR BESCHREIBUNG LIKE '%$txt_suchbegriff%'
                UNION SELECT * FROM menu, submenu WHERE menu.sitemap_deaktiviert =1 OR submenu.sitemap_deaktiviert =1

          gruss tina

  2. SELECT * FROM $db_table
          LEFT JOIN menu ON content.ID = menu.link
          LEFT JOIN submenu ON content.ID = submenu.link
          WHERE TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%' OR BESCHREIBUNG LIKE '%$txt_suchbegriff%' AND WHERE menu.sitemap_deaktiviert ='1' OR submenu.sitemap_deaktiviert ='1'

    Das wäre meine 2. Logische Lösung ich glaube ich bin schon nah dran aber es funktioniert nicht es kommt eine Fehlermeldung!

    SELECT * FROM $db_table
          LEFT JOIN menu ON content.ID = menu.link
          LEFT JOIN submenu ON content.ID = submenu.link
          WHERE TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%'
          OR BESCHREIBUNG LIKE '%$txt_suchbegriff%'
          WHERE menu.link=(select menu.link from menu where sitemap_deaktiviert !=1)
          WHERE submenu.link=(select submenu.link from submenu where sitemap_deaktiviert !=1)

    1. Hi,

      ja ich bin heute nicht so ganz auf dem Damm geistigermassen.

      Aber sag doch mal welche Fehlermeldung bekommst Du??

      Ausserdem liegst Du mit der Verschachtelerei aussnahmsweisenicht richtig.

      WHERE (menu.sitemap_deaktiviert =1 OR submenu.sitemap_deaktiviert =1) AND (TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%' OR BESCHREIBUNG LIKE '%$txt_suchbegriff%')

      Ich denke ma Ich habe versdtanden was Du haben möchtest. Mit Joins arbeite ich selten, deswegen weiss Ich nicht wie Du den Join zusammen baust.

      Auf jeden Fall, musst Du die 2 or Blocke wie oben in () fassen.
      diese Where anweisung sollte zumindest mal das gewünschte Ergebnis liefern. Was jedoch Dein Join hierbei macht weiss Ich nicht.
      Kenne ja Dein DB Design nicht und es ist auch noch ein kleiner unterschied ob man mit mysql oder Oracle arbeitet.

      Vieleicht kannst Du neben dem Fehler auch noch einen kleinen auszug Deiner betroffenen Tabellen incl. Inhalt posten.

      Gruss Matze

  3. Hallo,

    ich habe Problem mit folgende SQL Befehl:

    SELECT * FROM $db_table
          LEFT JOIN menu ON content.ID = menu.link
          LEFT JOIN submenu ON content.ID = submenu.link
          WHERE TITEL_MAIN LIKE '%$txt_suchbegriff%' OR CONTENT_MAIN LIKE '%$txt_suchbegriff%' OR BESCHREIBUNG LIKE '%$txt_suchbegriff%'

    Das geht? Worauf bezieht sich denn das LEFT im zweiten Left Outer Join? Meiner Meinung nach fehlen da Klammern.
    $db_table muss die Tabelle content sein.

    SELECT * FROM
          (content LEFT JOIN menu ON content.ID = menu.link)
          LEFT JOIN submenu ON content.ID = submenu.link
          WHERE TITEL_MAIN LIKE '%blah%' OR CONTENT_MAIN LIKE '%blub%' OR BESCHREIBUNG LIKE '%bilblu%'

    Nun möchte ich das ganze erweitern und zwar sollen nur die angezeigt werden in menu und submenu sitemap_deaktiviert auf 1 steht.

    menu.sitemap_deaktiviert ='1' OR submenu.sitemap_deaktiviert ='1'

    SELECT * FROM
          (content LEFT JOIN menu ON content.ID = menu.link)
          LEFT JOIN submenu ON content.ID = submenu.link
          WHERE (TITEL_MAIN LIKE '%blah%' OR CONTENT_MAIN LIKE '%blub%' OR BESCHREIBUNG LIKE '%bilblu%') AND (menu.sitemap_deaktiviert ='1' OR submenu.sitemap_deaktiviert ='1')

    viele Grüße

    Axel