Quindi ho due tabelle:
People Jobs
id | name id | personId | Status | place
-------------- ---------------------------------
1 | John 1 | 1 | Active | Home
2 | Melinda 2 | 1 | Active | Office
3 | Samuel 3 | 2 | Active | Home
4 | 3 | Active | Office
5 | 1 | Active | Garden
Problema:
Voglio visualizzare i nomi delle persone che hanno più di un lavoro attivo in casa o in ufficio. Potrei fare il conteggio e visualizzare il numero ma non riesco a visualizzare i nomi.
Ecco il mio codice (che non funziona):
SELECT t.name
FROM people p JOIN jobs j ON j.personId = p.id
WHERE j.status = "Active" AND j.place="Home" OR j.place="Office"
HAVING count(j.personId) > 1
risposte:
0 per risposta № 1i tuoi AND e OR sono mescolati nella condizione WHERE:
cambia questo
WHERE j.status = "Active" AND j.place="Home" OR j.place="Office"
a
WHERE j.status = "Active" AND (j.place="Home" OR j.place="Office")
Prova questo
SELECT p.name
FROM People p JOIN jobs t ON t.personId = p.id
WHERE t.status = "Active" AND (t.place="Home" OR t.place="Office")
GROUP BY p.name
HAVING count(t.personId) > 1
0 per risposta № 2
prova questa query
SELECT p.name
FROM people p JOIN jobs j ON j.personId = p.id
WHERE j.status = "Active" AND (j.place="Home" OR j.place="Office")
GROUP BY p.name
HAVING count(j.personId) > 1
0 per risposta № 3
Stai consolidando i dati ma senza "GROUP BY":
SELECT p.name
FROM people p JOIN jobs j ON j.personId = p.id
WHERE j.status = "Active" AND j.place="Home" OR j.place="Office"
GROUP BY p.name
HAVING count(j.personId) > 1
Tuttavia, ho già provato questo (sarà molto più efficiente se i dati di ls sono distorti ma potresti dover forzare un indice):
SELECT DISTINCT p.id, p.name
FROM people p
INNER JOIN jobs j1
ON p.id=j1.personId
AND j1.status="Active"
AND j1.place="Home"
INNER JOIN jobs j2
ON j1.personId=j2.personId
AND j2.status="Active"
AND j2.place="Office"