[SQL/Table Joins] Krieg' da was nicht hin... :o)

Hallo!

Ich habe ein kleines Problemchen, für Kenner (und Könner) wahrscheinlich ziemlich einfach, aber leider haben mir die SQL Webseiten die ich so gefunden habe auch nicht weiter geholfen…

Problem:

Zwei Tabellen (es gibt auch noch eine dritte, mit den category-Namen, aber die brauchen wir hier nicht):

career hasCategory
------ -----------
id pid
firstname cid
lastname
usw.

wobei die pid (person id) in hasCategory mit der id in career übereinstimmt.

Beispieldaten:

career
-------
id
255
256


hasCateory
----------
cid pid
a1 255
a2 255
a1 256
a3 255
usw.

Muss man sich so vorstellen: die „career“ Tabelle enthält Personen, denen Interessengebiete („category“) zugeordnet werden. Die Kategorien sind einfach a1, a2 usw.

Was nun passieren soll ist das jemand sagen kann „Ich will alle sehen die a1 als category haben“, oder „alle die a1 und a2 haben“ (nicht oder, solln die doch selbst schaun :smile:

Also z.B. so:

Suche nach a1
–> ergebnis 255, 256

Suche nach a2
–> ergebnis 255

Suche nach a1 und a3
–> nix

Suche nach a1 und a2
–> ergebnis 255

Suche nach „nix“
–> keine ausgabe

Wie stell ich das mit SQL an? Wenn jemand 2 Kategorien hat würde ich natürlich ihn gern nur einmal sehen, ich denke das geht mit „DISTINCT“.

Mein SQL statement sieht momentan so aus:

SELECT career.firstname, career.lastname, career.email, career.id, career.country FROM career, hasCategory where career.id > 0 and hasCategory.pid = career.id

So. Da ist jetzt aber natürlich noch keine Bedingung die z.B. das macht:

Formularfeld „a1“ ist „on“ --> alle aus career auswählen die a1 als Interesse haben
Formularfeld „a2“ ist auch „on“ --> alle aus career auswählen die a2 als Interesse haben, und die die a1 UND a2 haben nur einmal anzeigen

Ist das klar geworden?

ich habs mit „where hasCategory.cid = a1 and where hasCategory.cid = a2“ probier, aber leider erfolglos…

Wie geht das? Wenn ich mich unklar ausgedrückt hab bitte nachfragen.

Danke!!!

Dennis =o)

schönen morgen!

das problem bei deinem select ist, daß du bei den interessensgebieten für ein feld genau einen wert abfragst, jedoch dieses feld 2 werte haben soll … das funktioniert leider nicht mit einem „AND“ …

(hab jetzt leider nimmer die werte da)
als beispiel für den join 2-er tabellen:
career.id
1
2
3

hascategory.pid, hascategory,cid
1,a1
2,a1
1,a2
2,a3
3,a2
3,a3

die einzelnen sätze zwischen den beiden tabellen werden nun verknüpft (id,pid,cid)
1 - 1 - a1
2 - 2 - a1
1 - 1 - a2
etc.

verständlich? in deiner where-klausel wird die where-bedingung für jeweils einen satz angewandt, und da kann eine id bzw. pid nur eine cid haben, das bedeutet, es müssen sub-selects her …

vielleicht schafft dies abhilfe:

SELECT career.firstname,
career.lastname,
career.email,
career.id,
career.country
FROM career c, hascategory h
where c.id > 0
and c.id in (select pid
from hascategory h
where h.cid = a1)
and c.id in (select pid
from hascategory h
where h.cid = a2)

vielleicht hilft’s (wird sicher noch perfomantere abfragen geben)

grüße,
tomh

[MicrosoftJET Fehler] in Access ja, aber sonst…
Hallo Tomh!

Ich hab das jetzt mal gebaut, und in Access funktioniert das auch SUPER… (DANKE!!!) nur leider im Web nicht. Den Fehler krieg ich:

Error Type:
Microsoft JET Database Engine (0x80040E14)
Syntax error. in query expression ‚lastname and career.id in (select hasCategory.pid from hasCategory where hasCategory.cid = ‚a1‘)‘.
/alumni/career/empsearch.asp, line 252

Mein SELECT statement sieht (etwas umgebaut) so aus:

SELECT career.firstname, career.lastname, career.email, career.id, career.country FROM career, hasCategory where career.id > 0

und dann hab ich folgenden Loop:

 Do While Not res2.EOF

 If Request(res2("ID")) = "on" Then


 stmt = stmt & " and career.id in (select hasCategory.pid from hasCategory where hasCategory.cid = '" + res2("ID") + "')"

 End If
 res2.movenext
 loop

(also z.B. so: SELECT DISTINCT career.firstname, career.lastname, career.email, career.id, career.country
FROM career, hasCategory
WHERE career.id > 0 and career.id in (select hasCategory.pid from hasCategory where hasCategory.cid = ‚a1‘) and career.id in (select hasCategory.pid from hasCategory where hasCategory.cid = ‚a3‘):wink:

Wo könnte der Fehler denn liegen? Kann das sein dass man das evtl. mit der „Microsoft Jet Database Engine“ so nicht machen kann? Oder ist’s ein ganz einfacher Fehler?

Danke!

Dennis =o)

jetzt geht’s
Hallo nochmals :o)

Ich hab das jetzt hinbekommen… interessiert Dich sicher dass Dein Tipp mir SEHR geholfen hat :o)

DANKE!

Dennis =o)

PS: Der Fehler lag bei mir… ich hatte aus Versehen ein „order by“ vor dem „and id…“ usw.)

Probier mal folgendes:
select c.id from carrer c inner join hashcategory h on c.id=h.pid
where h.cid=‚a1‘ or h.cid=‚a3‘
group by c.id
having count(*) >=2

die 2 ist die Anzahl der Parameter, die übereinstimmen müssen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]