Ankündigung

Einklappen
Keine Ankündigung bisher.

1 Spalte mit mehreren Bedingungen

Einklappen

Neue Werbung 2019

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

  • 1 Spalte mit mehreren Bedingungen

    Hallo zusammen,

    ich habe ein Problem mit einer Mysql-Abfrage. Google habe ich schon bemüht, sowie das Forum, allerdings nichts gefunden, das mir weiterhilft.

    Ich möchte eine Abfrage generieren, die in einer Spalte mehrere Bedingungen überprüft.

    Unten seht ihr die Beziehungen der Tabellen.
    Mehrere Orte können auf 1 Eintrag in tblRegest.RegestText verweisen.

    Es soll nur etwas ausgegeben werden, wenn beide Bedingungen gleichzeitig zutreffen. Ich habe schon:

    WHERE tblOrt.Ort="Aalen" AND tblOrt.Ort="Bamberg"
    probiert. Geht aber nicht.
    Ich habe es schon mit GROUP_CONCAT probiert. Allerdings wertet die SQL-Abfrage alle Einträge aus, die entweder Aalen oder Bamberg heißen. Das gleiche Ergebnis mit:
    WHERE tblOrt.Ort IN ("Aalen, Bamberg")

    Ach ja:
    MATCH...AGAINST geht auch nicht, gleiches Ergebnis.

    Ich möchte aber ausdrücklich, dass nur etwas ausgeben wird, wenn mehrere Orte GLEICHZEITIG vorkommen.

    Kann man das in Mysql realisieren und falls ja, wie?

    Ich hoffe, ihr versteht, was ich meine.

    Liebe Grüße
    Angehängte Dateien

  • #2
    Eine Feld kann doch nicht gleichzeitig zwei Inhalte haben ?

    Kommentar


    • #3
      ja genau, das weiß ich auch. Deshalb funktioniert ja auch der erste Ansatz nicht.
      Aber es muss doch gehen, dass ein Benutzer nach 2 Orten suchen kann und alle Datensätze angezeigt werden, in denen beide Orte gleichzeitig vorkommen, oder?
      Ich dachte, wenn ich die Orte als GROUP_CONCAT zusammenfüge, könnte ich als String darin suchen. Das funktioniert auch, er zeigt mir dann ein Datensatz mit "Aalen Bamberg". Allerdings zeigt er mir auch alle anderen an, in denen entweder Aalen oder Bamberg vorkommen.

      Kommentar


      • #4
        Zitat von Vault Beitrag anzeigen
        ja genau, das weiß ich auch. Deshalb funktioniert ja auch der erste Ansatz nicht.
        Aber es muss doch gehen, dass ein Benutzer nach 2 Orten suchen kann und alle Datensätze angezeigt werden, in denen beide Orte gleichzeitig vorkommen, oder?
        Ich dachte, wenn ich die Orte als GROUP_CONCAT zusammenfüge, könnte ich als String darin suchen. Das funktioniert auch, er zeigt mir dann ein Datensatz mit "Aalen Bamberg". Allerdings zeigt er mir auch alle anderen an, in denen entweder Aalen oder Bamberg vorkommen.
        Dann musst du ODER (OR) benutzen
        Deine bedingung kann niemals erfüllt werden.

        Kommentar


        • #5
          Aber genau das will ich eben nicht
          Dann könnte ich auch gleich IN verwenden.
          In SQL gibt es INTERSECT, genau das bräuchte ich ja. Eine Schnittmenge. Leider gibts das in Mysql nicht.
          Deshalb dachte ich, in Mysql ginge das ähnlich.

          Kommentar


          • #6
            Zitat von Vault Beitrag anzeigen

            Es soll nur etwas ausgegeben werden, wenn beide Bedingungen gleichzeitig zutreffen. Ich habe schon:

            WHERE tblOrt.Ort="Aalen" AND tblOrt.Ort="Bamberg"
            probiert. Geht aber nicht.
            Wenn man das umstellt hast Du 2 Gleichungen: X=2 und X=3, das kann man dann auch kombinieren: 2=3.

            Schon recht früh habe ich in der Schule gelernt, daß das falsch ist.

            Vielleicht gehst Du einfach zurück auf Start und überdenkst Dein Problem. Viel Erfolg!

            Andreas

            Kommentar


            • #7
              Ich habe offenbar genau das selbe Problem, bin aber schon weiter. Eine Tabelle ist n:m mit einer anderen verknüpft. Durch diese Verknüpfung kann die erste Tabelle mit mehreren Datensätzen aus der zweiten kombiniert werden (und umgekehrt, das spielt aber in meiner Frage jetzt keine Rolle). Ich möchte nun alle Datensätze aus Tabelle 1 haben, welche in der Zieltabelle sowohl einen Datensatz A als auch einen Datensazt B zugewiesen haben. Viel Erfolg bei der Antwort.

              Kommentar


              • #8
                Zitat von ags Beitrag anzeigen
                Ich habe offenbar genau das selbe Problem, bin aber schon weiter. Eine Tabelle ist n:m mit einer anderen verknüpft. Durch diese Verknüpfung kann die erste Tabelle mit mehreren Datensätzen aus der zweiten kombiniert werden (und umgekehrt, das spielt aber in meiner Frage jetzt keine Rolle). Ich möchte nun alle Datensätze aus Tabelle 1 haben, welche in der Zieltabelle sowohl einen Datensatz A als auch einen Datensazt B zugewiesen haben. Viel Erfolg bei der Antwort.
                Code:
                test=*# select * from t1;
                 i |    t
                ---+---------
                 1 | master1
                 2 | master2
                 3 | master3
                (3 rows)
                
                Time: 0,205 ms
                test=*# select * from t2;
                 i | t
                ---+---
                 1 | A
                 1 | B
                 2 | A
                 3 | B
                (4 rows)
                
                Time: 0,201 ms
                test=*# select * from (select t1.i, array_agg(t2.t) as my_array from t1 left join t2 on t1.i=t2.i group by 1) foo where my_array @> array['A','B'];
                 i | my_array
                ---+----------
                 1 | {A,B}
                (1 row)
                
                Time: 0,466 ms
                Andreas, natürlich und wie immer mit PostgreSQL erprobt

                Kommentar


                • #9
                  Danke soweit, aber ich verstehs nicht. Ich hätte vielleicht dazu schreiben sollen, das ich eine Lösung für mysql suche und das dieser query OPTIONAL in einen anderen mit eingebaut werden soll, der an sich auch schon nicht so einfach ist, bis jetzt aus vielen left joins besteht.

                  Kommentar


                  • #10
                    Zitat von ags Beitrag anzeigen
                    Danke soweit, aber ich verstehs nicht. Ich hätte vielleicht dazu schreiben sollen, das ich eine Lösung für mysql suche und das dieser query OPTIONAL in einen anderen mit eingebaut werden soll, der an sich auch schon nicht so einfach ist, bis jetzt aus vielen left joins besteht.
                    Ja, mit MySQL wird das nicht 1:1 gehen, aber das in eine größere Abfrage einzubauen (PG...) wäre kein Thema.

                    Andreas

                    Kommentar


                    • #11
                      Zitat von ags Beitrag anzeigen
                      Danke soweit, aber ich verstehs nicht.
                      Der *Trick* ist ein ARRAY als Aggregation zu bauen, der je ID aus der linken Tabelle die Werte von rechts enthält, und den Inhalt dann zu prüfen, ob die 2 geforderten Werte im ARRAY enthalten sind. Aber ich weiß nicht, ob das so in MySQL abbildbar ist.

                      Falls nicht: PG kostet nix

                      Andreas

                      Kommentar


                      • #12
                        Was ist (PG...)? Das Einbauen soll so sein, daß standardmäßig nur auf Datensatz A in der Zieltabelle geprüft wird und wenn aber eine bestimmte Variable gesetzt ist, dann auch auf Datensatz B geprüft werden soll. Ich löse das im Moment so dass ich den Query-String dynamisch mit PHP auf baue. Kennst Du Dich mit Mysql hinreichend aus um mir weiter helfen zu können?

                        Kommentar


                        • #13
                          Zitat von ags Beitrag anzeigen
                          Was ist (PG...)?
                          PostgreSQL

                          Das Einbauen soll so sein, daß standardmäßig nur auf Datensatz A in der Zieltabelle geprüft wird und wenn aber eine bestimmte Variable gesetzt ist, dann auch auf Datensatz B geprüft werden soll. Ich löse das im Moment so dass ich den Query-String dynamisch mit PHP auf baue. Kennst Du Dich mit Mysql hinreichend aus um mir weiter helfen zu können?
                          Nö.

                          Andreas

                          Kommentar


                          • #14
                            Du kannst Tabellen auch mehrmals Joinen.

                            Das geht nicht:
                            Code:
                            tblOrt.Ort="Aalen" AND tblOrt.Ort="Bamberg"
                            Das würde gehen:
                            Code:
                            tblOrt1.Ort="Aalen" AND tblOrt2.Ort="Bamberg"

                            Kommentar


                            • #15
                              Ich habe es hin bekommen: beide Bedingungen durch einen INNER JOIN erlangen und diese beiden an der Ersten Tabelle ansetzen:

                              SELECT * FROM table1 t1
                              INNER JOIN mntab mnA ON (t1.ID = mnA.t1ID) LEFT JOIN table2 t2A ON (mnA.t2ID = t2A.ID)
                              INNER JOIN mntab mnB ON (t1.ID = mnB.t1ID) LEFT JOIN table2 t2B ON (mnB.t2ID = t2B.ID)
                              WHERE t2A.Ort LIKE '$ort1' AND t2B.Ort LIKE '$ort2'

                              jetzt fehlt blos noch eine möglichkeit das ganze skalierbar zu machen, also eine beliebige zahl von Orten eingeben zu können. Also auch drei oder vier, die passen müssen. Wie geht das?

                              ps: ich hoffe das stimmt so, ich habe versucht meinen eigenen fall in den hier gefragten zu 'übersetzen'...

                              Kommentar

                              Lädt...
                              X