boubou: Select befehl richtig kombiniert?

Hallo hab da mal eine kleine Frage. Ich habe 2 select befehle die ich zu einem zusammen fassen muss

1. Befehl
SELECT ordner_id FROM ordner_register WHERE register_id = '$registerid'

2 Befehl
SELECT * FROM ordner WHERE (ordner_inhalt LIKE '%$name%' OR ordner_inhalt LIKE '%$name%') AND Deleted = '0'

Meine Zusammenfassung der beiden:

SELECT ordner_register.ordner_id FROM ordner_register,ordner WHERE ordner_register.ordner_id = ordner.ordner_id AND (ordner.ordner_inhalt LIKE '%$name%' OR ordner.ordner_name LIKE '%$name%') AND (ordner.Deleted = '0' AND ordner_register.register_id = '$registerid')

Ich kriege zumindest keinen Sql fehler, aber auch keine Ergebnisse.

Wenn dieser Select Befehl falsch ist wie müsste ich die beiden oben denn richtig kombinieren?

  1. Ich kriege zumindest keinen Sql fehler, aber auch keine Ergebnisse.

    es ist naheliegen, dass du gleich viel oder weniger bekommst als wenn du jeweils beide einzeln ausführst - kein ergebnis ist auch eine möglichkeit

    Wenn dieser Select Befehl falsch ist wie müsste ich die beiden oben denn richtig kombinieren?

    du suchst entweder UNION oder den OR-operator ;)

    SELECT xxx FROM tabelle WHERE (zeug aus where-clause 1) OR (zeug aus where-clause 2)

    im übrigen ist SELECT * nur selten eine gute idee

    1. SELECT xxx FROM tabelle WHERE (zeug aus where-clause 1) OR (zeug aus where-clause 2)

      Also sooo:

      SELECT ordner_register.ordner_id FROM ordner_register,ordner WHERE ((ordner.ordner_inhalt LIKE '$name' OR ordner.ordner_name LIKE '$name') AND ordner.Deleted = '0') AND (ordner_register.register_id = '$registerid')

      Ist das richtig so?
      Der Grund warum ich die verknüpfe ist wegen einer Suchfunktion. Der User kann einmal Ordnerinhalt durchsuchen daher der 2 Befehl. Er kann auch nach Registern im Ordner suchen daher der 1. Befehl. Zusätzlich kann der User nach beiden gleichzeitig suchen daher die Kombination. Ich weiss das mir beide einzeln Ergebnisse liefern, er müsste mir jetzt die Ergebnisse der beiden einzelnen alle ausliefern.

      1. yo,

        SELECT ordner_register.ordner_id FROM ordner_register,ordner WHERE ((ordner.ordner_inhalt LIKE '$name' OR ordner.ordner_name LIKE '$name') AND ordner.Deleted = '0') AND (ordner_register.register_id = '$registerid')

        Ist das richtig so?

        zum einen fehlt die join bedingung, würdet du anstelle der impliziten join systax eine explizite benutzen, dann könnte das nicht so leicht passieren.

        zum andere muss man ja nicht immer versuchen, alles in eine abfrage zu bekommen. die erste frage, die sich stellt, sind den auch die ausgaben der spalten gleich bei den zwei verschiedenen suchabfragen ? unterscheiden die sich nämlich, macht es viel mehr sinn, sie nicht zusammenzufassen.

        Ilja

        1. ich habs Hinbekommen mit UNION. Jetzt klappts auch

          1. Mal ne andere Frage:
            Ich habe ja mein Problem mit Union gelöst. Nur jetzt habe ich doppelte Einträge, weil er mir vom ersten und 2 Select Befehl die Ergebnisse gibt.
            Der erste Select Befehl gibt mir die Ids 85,86.
            Der zweite Select Befehl gibt mir die Ids 85,87
            Wenn ich beide verknüpfe wie da unten krieg ich raus 85,85,86,87.
            Ich muss irgendwie einbauen, dass die doppelten rausgelassen werden habs mit distinct für die beiden select Befehle versucht geht nicht.
            SELECT ordner_id FROM ordner WHERE (ordner_inhalt LIKE '%$name%' OR ordner_name LIKE '%$name%') AND Deleted='0' UNION SELECT ordner_id FROM ordner_register WHERE register_id = '$registerid'"

            1. yo,

              Wenn ich beide verknüpfe wie da unten krieg ich raus 85,85,86,87.

              das glaube ich nicht....

              SELECT ordner_id FROM ordner WHERE (ordner_inhalt LIKE '%$name%' OR ordner_name LIKE '%$name%') AND Deleted='0' UNION SELECT ordner_id FROM ordner_register WHERE register_id = '$registerid'"

              ...dass du mit exact dieser abfrage zweimal 85 rausbekommst, das kann nicht sein.

              Ilja

              1. Doch ich kriege haargenau diese Ausgabe raus:

                D  Ordnerame Ordnerinhalt  Platz  Spalte
                85 ordner    inhalt B001 2
                86 inhalt    inhaltlala B002 2
                87 test    test  B004 2
                85 ordner    inhalt B001 2
                86 inhalt    inhaltlala B002 2

                Das ist meine Ausgabe er liefert mir von jedem Select befehl also den beiden die ergebnisse. Der erste Befehl liefert mit dir 85,86 und der 2 Befehl die 85 und 87 und die beide mit Union kombiniert liefert mir das da oben.

                1. yo,

                  Doch ich kriege haargenau diese Ausgabe raus:

                  ich bleibe bei meinen nein, weil....

                  D  Ordnerame Ordnerinhalt  Platz  Spalte
                  85 ordner    inhalt B001 2
                  86 inhalt    inhaltlala B002 2
                  87 test    test  B004 2
                  85 ordner    inhalt B001 2
                  86 inhalt    inhaltlala B002 2

                  .. dieses ergebnis von einer anderen abfrage kommen muss, als du uns ursprünglich gepostet hast. schau dir mal die spalten an, die du hier ausgibst und die spalten, die du in der abfrage ausgibst. sind auffällig mehr bei diesem ergebnis hier.

                  für dich mag der unterschied nicht relevant sein, dass du mehr spalten ausgibst. aber wenn du wüsstest, wie UNION funktioniert, dann wäre dir bewußt, dass die unterschiedliche anzahl von spalten zur folge hat, dass die ergebnismengen unterschiedlich sind.

                  der grund dafür liegt darin, das UNION im gegensatz zu UNION ALL "doppelte" werte automatisch rausfiltert, sprich gleiche werte auf die !! ganze !! zeile bezogen können nichzt gleich sein, wenn du UNION einsetzt.

                  also poste die eigentliche abfrage, mit der du doppelte werde bekommst und keine zusammenfassung, die zu unterschiedlichen ergebnisse führt.

                  Ilja

                  1. also poste die eigentliche abfrage, mit der du doppelte werde bekommst und keine zusammenfassung, die zu unterschiedlichen ergebnisse führt.

                    Das hier ist der Select Befehl mit dem ich diese Ergebnisse bzw Tabelle bekomme

                    $abfrage = " SELECT ordner_id FROM ordner_register WHERE register_id = '$registerid' UNION SELECT ordner_id FROM ordner WHERE (ordner_inhalt LIKE '%$name%' OR ordner_name LIKE '%$name%') AND Deleted='0'";

                    1. Übrigens zur Info meine ordner_register table hat als Spalten ordner_id und register_id beides sind integer Typen.

                      Meine ordner table hat ordner_id,ordner_name,ordner_inhalt,insertdatum,editdatum,... usw also deutlich mehr spalten und die ordner_id ist integer aber der Rest Text,varchar oder Datetime.

                      Könnte es damit zutun haben?

                    2. yo,

                      Das hier ist der Select Befehl mit dem ich diese Ergebnisse bzw Tabelle bekomme

                      $abfrage = " SELECT ordner_id FROM ordner_register WHERE register_id = '$registerid' UNION SELECT ordner_id FROM ordner WHERE (ordner_inhalt LIKE '%$name%' OR ordner_name LIKE '%$name%') AND Deleted='0'";

                      das ist nicht möglich, zumal das auch ein codeschnipsel ist und keine sql anweisung. bei dieser abfrage gibst du nur ! eine ! spalte aus, nämlich die ordner_id. wie kann diese abfrage den informationen über Ordnerame, Ordnerinhalt, Platz, etc. enthalten ?

                      da musst du noch mal in dich gehen und schauen, ob da was nicht durcheinander geht, was wir noch nicht wissen.

                      Ilja