[MSSQL] select anweisung

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

  • [MSSQL] select anweisung

    ich bekomme einfach die passende select anweisung nicht hin. wäre schön wenn mir jemand helfen könnte.

    also, ich habe 3 tabellen:

    Cocktail mit den attributen - cocktailnummer (prim_key), bild, art, name

    Zutaten mit den attributen - zutatennummer (prim_key), name, art,
    alkoholgehalt, preis

    Zugehörigkeit mit den attributen - cocktailnummer (prim_key), zutatennummer
    (prim_key), menge

    ich will eine suchfunktion in meine seite integrieren. das problem ist
    jetzt folgendes: es werden 2 (oder mehr) zutaten in das suchfeld durch "AND"
    getrennt eingegeben. es sollen alle cocktails ausgegeben werden in denen ALLE
    gesuchten zutaten drin sind. (kein entweder/oder). wie lautet die dazu
    passende sql anweisung???

    danke
    Tomislaw

  • #2
    also deine tabelle 'zugehörigkeit' kann schon mal nicht stimmen.

    ES KANN KEIN PRIMARY KEY ZWEIMAL VERWENDET WERDEN!!!

    ansosten sähe deine query so aus.
    Code:
    SELECT
        *
    FROM
        zugehoerigkeit Z
            LEFT JOIN cocktail  C ON (C.cocktailnummer = Z.cocktailnummer)
            LEFT JOIN attribute A ON (A.zutatennummer  = Z.zutatennummer)
    WHERE
        A.name = 'ananas' AND
        A.name = 'zitrone'
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      danke erstmal für die antwort.

      zu der primary key sache:
      die entities sind doch aber nur durch cocktailnummer und zutatennummer zusammen eindeutig bestimmt. mysql hatte kein problem damit 2 attribute im primary key anzugeben. sollte man da noch eine zugehörigkeits id vergeben?

      der angegebene code funktioniert bei mir nicht wirklich. die ergebnismenge ist immer leer. die tabelle attribute soll wohl meine zutatentabelle sein
      und SELECT * FROM zugehörigkeit habe ich mal in
      SELECT * FROM cocktail umgedeutet (da ich ja die cocktailnamen haben will und diese in der tabelle cokctail sind).
      leider habe ich keine ahnung was ein left join veranstaltet. da werde ich mal versuchen mich schlau zu machen...

      Kommentar


      • #4
        ok. die attribute waren in der tat die zutaten.....

        aber warum änderst du zugehoerigkeit???? du hast eine tabelle, in der die ids aus cock... und zut... stehen. und die wird in meinem beispiel abgefragt. wenn dort nun nichts drin ist, kann auch nicht gezeigt werden.

        man kann die abfrage auch anders darstellen. das geht auch ....
        Code:
        SELECT
            *
        FROM
            cocktail  C 
                LEFT JOIN ON zugehoerigkeit Z (C.cocktailnummer = Z.cocktailnummer)
                    LEFT JOIN zutaten Z ON (Z.zutatennummer = A.zutatennummer)
        WHERE
            Z.name = 'ananas' AND
            Z.name = 'zitrone'
        aber bitte ändere keine tabellennamen, wenn du nichts weisst, was du tust.

        alternativ zum test, solltest du auch mal das ganze WHERE entfernen.
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          hmm, phpmyadmin sagt bei deinem letzten code:
          u have an error in your sql statement!

          und irgendwie hast du für zutaten und zugehoerigkeit auch die selbe abkürzung (nämlich Z) benutzt.
          ich werde mich aber davor hüten jetzt irgendwelche änderungsvorschläge zu unterbreiten

          wenn ich das "where" weglasse, die reihenfolge von "ON" und zugehoerigkeit Z vertausche, sowie zutaten A benutze
          dann ist das ergebnis eine riesen tabelle in der alle 3 tabellen aneinandergehängt wurden.
          mit "where" ist die ergebnismenge leer, obwohl ich sicher bin, daß es einen cocktail mit diesen 2 zutaten gibt.


          Kommentar


          • #6
            also ich hab mich mal ein wenig schlau gemacht (und schlau machen lassen) und bin auf folgende sql anweisung bei meinem obigen problem gekommen :

            Code:
            SELECT DISTINCT c.name
            FROM cocktail c, zugehoerigkeit zg
            WHERE (
            (
            c.cocktailnummer = zg.cocktailnummer
            ) AND (
            zg.cocktailnummer
            IN (
            
            SELECT zg.cocktailnummer
            FROM zugehoerigkeit zg, zutaten z
            WHERE (
            (
            zg.zutatennummer = z.zutatennummer
            ) AND (
            z.name = "ananas"
            )
            )
            )
            ) AND (
            zg.cocktailnummer
            IN (
            
            SELECT zg.cocktailnummer
            FROM zugehoerigkeit zg, zutaten z
            WHERE (
            (
            zg.zutatennummer = z.zutatennummer
            ) AND (
            z.name = "minze"
            )
            )
            )
            )
            )
            leider meldet phpmyadmin immer noch einen fehler. sieht da jemand was verdächtiges?
            auf mysql.de meine ich gesehen zu haben, daß sub-select nach einem "IN" erlaubt ist. ich benutzt mysql 4.0.13

            mille grazie

            Kommentar


            • #7
              kann es sein, dass der subselect erst ab mysql4.1 erlaubt ist? meine ich nämlich.
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                erst ab 4.1? das ist aber schlecht.
                wie kann man den query denn umformulieren, so daß er bei mir funktioniert?

                Kommentar


                • #9
                  erstelle eine query für den subselect.
                  lies die daten aus und sende eine zweite query an die DB.
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    okay, ich habs hinbekommen.

                    für jede zutat (also jeden sub-query) eine temp table erzeugen und dann einen natural join ueber cocktail und alle temp tables.

                    vielen dank fuer die hilfe

                    Kommentar

                    Lädt...
                    X