SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden. |
 |

13-09-2003, 21:23
|
Tomislaw
Newbie
|
|
Registriert seit: Sep 2003
Beiträge: 6
|
|
[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
|

13-09-2003, 22:56
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
|
|
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'
|

14-09-2003, 01:57
|
Tomislaw
Newbie
|
|
Registriert seit: Sep 2003
Beiträge: 6
|
|
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...
|

14-09-2003, 11:22
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
|
|
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.
|

14-09-2003, 20:01
|
Tomislaw
Newbie
|
|
Registriert seit: Sep 2003
Beiträge: 6
|
|
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.
|

17-09-2003, 02:45
|
Tomislaw
Newbie
|
|
Registriert seit: Sep 2003
Beiträge: 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
|

17-09-2003, 10:11
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
|
|
kann es sein, dass der subselect erst ab mysql4.1 erlaubt ist? meine ich nämlich.
|

17-09-2003, 17:48
|
Tomislaw
Newbie
|
|
Registriert seit: Sep 2003
Beiträge: 6
|
|
erst ab 4.1? das ist aber schlecht.
wie kann man den query denn umformulieren, so daß er bei mir funktioniert?
|

17-09-2003, 18:37
|
Abraxax
  THE REAL HAXE (Administrator)
|
|
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
|
|
erstelle eine query für den subselect.
lies die daten aus und sende eine zweite query an die DB.
|

20-09-2003, 18:33
|
Tomislaw
Newbie
|
|
Registriert seit: Sep 2003
Beiträge: 6
|
|
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
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|