Announcement

Collapse
No announcement yet.

sql query: "or" durch "and" ersetzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • sql query: "or" durch "and" ersetzen

    Hallo allerseits,
    ich möchte bei einer Abfrage ein "or" durch ein "and" ersetzen - leider ist das schwieriger als gedacht.
    Hier meine Tabellen:
    Code:
    Tabelle rezepte:
    xid | titel
    1   | abc
    2   | def
    3   | ghi
    
    Tabelle zutaten:
    auto-id | xid | zutat
    1       | 1   | milch
    2       | 1   | mehl
    3       | 1   | eier
    4       | 2   | butter
    5       | 2   | zucker
    6       | 3   | backpulver
    
    Tabelle kategorien:
    auto-id | xid | kategorie
    1       | 1   | kuchen
    2       | 1   | gebaeck
    3       | 2   | foo
    4       | 3   | bar
    Folgenden Abfrage führe ich momentan aus:
    Code:
    select rezepte.*, zutat, kategorie from rezepte, zutaten, kategorien where rezepte.xid = zutaten.xid and rezepte.xid = kategorien.xid and (titel like '%abc%') and (zutat like '%milch%' or zutat like '%ei%') and (kategorie like '%kuchen%' or kategorie like '%geb%') order by rezepte.titel;
    Diese Abfrage liefert natürlich den (bzw. die) gewünschten Treffer. Verändere ich eines der "or" in "and", gibt es keinen Treffer.
    Hab schon mein altes DB-Script aus der FH durchwühlt, aber das schweigt sich zu diesem Thema aus. :/

  • #2
    Hallo fogfrog,

    leider weiß ich nicht, was bei Deiner Abfrage herauskommen soll. Aber schau Dir mal zum allgemeinen Verständnis meinen Beitrag in folgendem Link an:

    http://http://entwickler-forum.de/showthread.php?t=48144


    Wenn Du in Deiner Abfrage z. B. in der Klammer
    (zutat like '%milch%' or zutat like '%ei%')
    das OR durch ein AND ersetzt,
    findest Du nur Zutaten,
    die sowohl "milch" als auch "ei" enthalten. Z.B.:
    "Meiermilch"

    Mit Deiner Originalabfrage findest Du halt Zutaten,
    die entweder "milch" oder "ei" oder beides enthalten.
    z. B.:
    "Müllermilch"
    "Rührei"
    "Meiermilch"



    Gruß frauwue
    Zuletzt editiert von frauwue; 15.05.2008, 22:12. Reason: Ergänzung
    docendo discimus

    Comment


    • #3
      Hallo frauwue, danke für deine Antwort!
      Das Ganze gehört zu einer Rezeptverwaltung. In einer Suchfunktion möchte ich gern nach Rezepten suchen können - nach Titel, Zutaten und Kategorien.
      Die Abfrage z.B. bei den Zutaten ist mit "oder" kein Problem (z.B. Eier _oder_ Milch) - das ist aber auch nicht die Abfrage, die ich letztlich haben möchte.
      Das, was ich haben möchte, und was auch das Problem ist, ist die Suchabfrage, mit der ich nur die Rezepte finde, in denen z.B. die Zutaten Eier _und_ Milch (oder noch mehr Zutaten) drin vorkommen müssen. Dazu muss ich wohl den ganzen Query komplett umbauen - nur weiß ich grad nicht, wie. Das übersteigt meine eher rudimentären Datenbank-/SQL-Kentnisse ein wenig... Doubletten bei den Suchergebnissen wären mir erstmal egal, die kann ich auch via Java eleminieren.

      Oh, grad die Erweiterung deines Beitrags gesehen: wenn ich einfach die 'or' durch 'and' ersetze, bekomme ich kein Ergebnis (0 rows selected).

      Comment


      • #4
        Hallo fogfrog,

        da musst Du wahrscheinlich mit unterschiedlichen Querys arbeiten, je nachdem was Du genau suchst und wieviele Suchkriterien Du hast.

        Gruß frauwue
        docendo discimus

        Comment


        • #5
          Originally posted by fogfrog View Post
          Das, was ich haben möchte, und was auch das Problem ist, ist die Suchabfrage, mit der ich nur die Rezepte finde, in denen z.B. die Zutaten Eier _und_ Milch (oder noch mehr Zutaten) drin vorkommen müssen. Dazu muss ich wohl den ganzen Query komplett umbauen
          Dafür müßte Deine Abfrage doch genau richtig sein. Du mußt hier semantisch aufpassen. Wenn Du schreibst "in denen die Zutaten Eier _und_ Milch" vorkommen, meinst Du in Wirklichkeit "bei denen die Zutat 'Eier' oder die Zutat 'Milch' eingesetzt wird". Solange es keine Eiermilch oder Milcheier gibt, ist das OR genau das richtige Mittel zur Wahl.

          Originally posted by fogfrog View Post
          Oh, grad die Erweiterung deines Beitrags gesehen: wenn ich einfach die 'or' durch 'and' ersetze, bekomme ich kein Ergebnis (0 rows selected).
          Na na na. Das ist ja so als ob Du sagst "Ich WILL jetzt aber, daß mein Rasenmäher mit Diesel läuft. Huch gerade an der Tanke gesehen, die haben auch Diesel. Diesel reingetan. Mist, läuft nicht. Warum nur, ich will es doch aber!"

          Nimm mal die Einschränkung auf den Titel "abc" heraus, der grenzt ja Deine Treffermenge schon auf nur ein Rezept ein. Und dann solltest Du auch die Zutaten Ei und Milch in Deinem Ergebnis sehen.
          Dirk

          Comment


          • #6
            Hallo fogfrog,

            Originally posted by fogfrog View Post
            ...mit der ich nur die Rezepte finde, in denen z.B. die Zutaten Eier _und_ Milch ...
            Nur weil du "Eier" UND "Milch" finden willst, heißt doch noch lange nicht das die Abfrage mit UND formuliert werden muß .

            Originally posted by fogfrog View Post
            ... Dazu muss ich wohl den ganzen Query komplett umbauen - nur weiß ich grad nicht, wie ...
            Am besten lößt man solche "Mengenproblem" mit Subqueries - eine einfache WHERE-Bedingung mit AND / OR bezieht sich ja immer nur auf einen Datensatz.

            z.B. für die Zutaten:[highlight=sql]
            select rezepte.*, zutat
            from rezepte
            inner join zutaten on zutaten.xid = rezepte.xid
            where rezepte.titel like '%abc%'
            and zutaten.auto-id in (
            select iz.auto-id from zutaten iz
            where iz.zutat like '%milch%'
            and iz.xid = rezepte.xid)
            and zutaten.auto-id in (
            select iz.auto-id from zutaten iz
            where iz.zutat like '%ei%'
            and iz.xid = rezepte.xid)
            order by rezepte.titel;
            [/highlight]

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Mal zum Verständnis:

              Eine WHERE-Bedingung selektiert datensatzweise. D.h. sie bezieht sich immer auf ein und denselben Datensatz. Möchte ich in meiner Ergebnismenge also Ei UND Milch haben, müssen die DATENSÄTZE ausgewählt werden die Ei ODER Milch sind.
              Eine Abfrage ...WHERE zutat like '%ei% AND '%milch' ... würde also immer nur Rezepte finden, die in irgendeiner EINZELNEN Zutat sowohl ei als auch milch haben, also die benannte eiermilch, die milcheier, die feine milch, etc. aber NIEMALS Zutaten mit ei oder milch und erst recht nicht Rezepte die sowohl milch als auch eier enthalten.

              Bei relationalen Beziehungen (wie hier mit den Zutaten) kann es aber durchaus sein, daß ich Ergebnisse haben möchte, die in einer bestimmten Menge (Zutaten) Ei UND (im Sinne von sowohl als auch) Milch enthalten. Das läßt sich nicht mehr mit einem einfachen WHERE ... AND / OR ... lösen. Hier muß die Existens von Untermengen abgefragt werden - siehe mein vorhergehendes Beispiel - und das dann durchaus mit einer UND-Verknüpfung in der WHERE-Bedingung.

              Man muß sich also im Vorfeld im klaren sein, woran sich die Bedingung orientiert, am einzelnen Datensatz oder einer verknüpften Menge!

              Hoffe, daß war etwas verständlich

              Gruß Falk
              Zuletzt editiert von Falk Prüfer; 16.05.2008, 08:36.
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo an alle,

                vielen Dank für eure Beiträge & Hilfe!

                Mittlerweile habe ich das Problem gelöst, allerdings auf meine eigene Weise:[highlight=sql]select t1.*, t2.zutat, t3.zutat, t4.kategorie, t5.kategorie from
                (select tmp1.*, zutat from rezepte tmp1, zutaten tmp2 where tmp1.rid = tmp2.rid and zutat like '%Hackfleisch%')t1,
                (select tmp3.*, zutat from rezepte tmp3, zutaten tmp4 where tmp3.rid = tmp4.rid and zutat like '%Blätterteig%')t2,
                (select tmp5.*, zutat from rezepte tmp5, zutaten tmp6 where tmp5.rid = tmp6.rid and zutat like '%Pfeffer%')t3,
                (select tmp7.*, kategorie from rezepte tmp7, kategorien tmp8 where tmp7.rid = tmp8.rid and kategorie like '%Backen%')t4,
                (select tmp9.*, kategorie from rezepte tmp9, kategorien tmp10 where tmp9.rid = tmp10.rid and kategorie like '%Blätterteig%')t5
                where t1.xid = t2.xid and t1.xid = t3.xid and t1.xid = t4.xid and t1.xid = t5.xid AND t1.title like '%Hackfleisch in Blätterteig%';[/highlight]
                Bin auf die Idee mit den Subqueries im From-Teil u. a. hier gestoßen: http://www.smart-soft.co.uk/Oracle/a...ial-part-3.htm

                @Falk: leider hat dein Code nicht funktioniert, 0 rows selected war das Ergebnis. :/

                PS: wie bekommt man die SQL-Formatierung? [sql][/sql] funktioniert nicht?!
                Zuletzt editiert von fogfrog; 19.05.2008, 20:04. Reason: sql-highlighting aktiviert

                Comment


                • #9
                  Originally posted by fogfrog View Post
                  ...PS: wie bekommt man die SQL-Formatierung? [sql][/sql] funktioniert nicht?!
                  Suchen + Lesen: Wichtig: Formatierung von SQL in Beiträgen
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment


                  • #10
                    Originally posted by Falk Prüfer View Post
                    Muchas Gracias!

                    Comment

                    Working...
                    X