2009-08-13 10 views
0

OK, der Titel ist verwirrend, aber ich werde erklären. Sagen wir, ich habe eine Mitarbeiterqualifikation db, für die ich möchte, dass Manager in der Lage sind, zu suchen.Auswahl Datensätze von nur mit beiden Kriterien begrenzt erfüllt

Ein Manager für Mitarbeiter mit Nunchuck Fähigkeiten suchen möchten ... ok groß, das ist einfach: SELECT * FROM skilllist WHERE skillname = "Nunchuck"

Bam! Ich habe eine Liste von Mitarbeitern mit Nunchuck-Fähigkeiten.

Aber sagen Sie, dass ein Manager eine Liste von Mitarbeitern mit sowohl "nunchuck" Fähigkeiten und "Bogenpersonal" Fähigkeiten erhalten möchte. Wie würde ich eine solche Abfrage erstellen? Ich kann nicht einfach sagen:

SELECT * FROM skilllist WHERE skillname = "Nunchuck" AND skillname =

oder

SELECT * FROM skilllist "Personal Bogen" WHERE skillname = "Nunchuck" OR skillname = „Bogen Mitarbeiter "

Letzteres würde nur alle Mitarbeiter mit Nunchuck Fähigkeiten und alle Mitarbeiter mit Bogen Mitarbeiter Fähigkeiten zurückgeben. Ich möchte NUR Mitarbeiter mit beiden Fähigkeiten bekommen. Ich kann es nicht herausfinden. Bitte helfen Sie! :)

+1

Es scheint, Mitarbeiter-to-Fähigkeit ist eine many-to-many-Beziehung. Das deutet darauf hin, dass es mehr als einen Tisch gibt. Ihre SQL präsentiert es anders. Das deutet darauf hin, dass Ihr Abfrageprozess problematisch sein wird. Kannst du mehr Details zur Struktur angeben? – Smandoli

+0

Sicher, hier ist die Tabellenstruktur für skilllist: listid memberid divisionid categoryid skillid Kenntnisse Diese Tabelle enthält eine Liste für alle Fähigkeiten für jeden Mitarbeiter eingegeben. Listid ist ein Primärschlüssel. – user143038

Antwort

0
select * from employees where 
employeeID in (select memberID from skilllist where skillname = 'nunchuck') and 
employeeID in (select memberID from skilllist where skillname = 'bow staff') 
+0

Am nächsten, was ich brauchte. VIELEN DANK! – user143038

0

EDITED Von eindeutig falsche erste Antwort, wo ich zu schnell beim Lesen der Post war.

Sie könnten nach Mitarbeiter gruppieren und zählen, wobei die Anzahl = die Anzahl der Fähigkeiten, die Sie suchen. Dies setzt voraus, dass es keine Doppelarbeit gibt. Dies ist die Syntax, die ich für MSSQL verwenden würde, könnte also für MySQL etwas anders sein.

SELECT [EmployeeName], Count(1) FROM 
skilllist 
WHERE skillname in ("nunchuck","bow staff") 
Group By [EmployeeName] 
Having Count(1) = 2 
+0

Das ist das gleiche Problem wie mit AND. Es wird diejenigen zurückgeben, die entweder Nunchuck oder Bogenstab haben. – northpole

+0

Ich bin ein Tölpel. Entschuldigung, eine Sekunde. – cmsjr

+0

huh .. wird das nicht funktionieren? Ich denke, die Klausel "Haben" wird nur diejenigen zurückgeben, die beide Fähigkeiten haben. Fehle ich hier etwas? –

0

Ja, ich stimme Smandoli zu.

Aber dann müssen Sie die IDs vergleichen und Query-Statement mit einem UND-Klausel erweitern:

SELECT * FROM skilllist WHERE skillname= "nunchuck" AND skillname= "bow staff" AND table1.id=table2.id 
0

Das könnte funktionieren:

Select * 
    from employees 
where 1 < (select count(*) 
       from skilllist 
      where slilllist.emp_id = employees.emp_id 
       and skillname in ('nunchuck','bow staff')) 

Es ist jedoch schwer Codes, um die Menge von Fähigkeiten . Also, wenn Sie jetzt eine dritte Wahl hinzugefügt würden Sie die 1 bis 2.

0
Select * from employees 
RIGHT JOIN skilllist s1 ON s1.memberid = employees.id AND s1.skillname = "nunchuck" 
RIGHT JOIN skilllist s2 ON s2.memberid = employees.id AND s2.skillname = "bow staff" 

erhöhen müssen ...

Verwandte Themen