I have the following MySQL table called skills.
id | idUser | idSkill |
---|---|---|
1 | 4 | 1 |
2 | 8 | 4 |
3 | 8 | 9 |
4 | 13 | 9 |
5 | 18 | 2 |
6 | 22 | 1 |
7 | 27 | 2 |
8 | 32 | 4 |
9 | 11 | 2 |
10 | 32 | 9 |
I need to select, for example, all idUsers that have idSkill 4 and 9 at the same time.
The result would be idUser 8 and 32.
How can I create such a query with PHP and MySQL?
Many thanks
One simple approach uses aggregation:
SELECT idUser
FROM skills
WHERE idSkill IN (4, 9)
GROUP BY idUser
HAVING MIN(idSkill) <> MAX(idSkill);
The above query is sargable , meaning that an appropriate index can use the idSkill
column. Consider adding this index for added performance:
CREATE INDEX idx ON skills (idUser, idSkill);
Edit:
Use this query for 3 items:
SELECT idUser
FROM skills
WHERE idSkill IN (2, 4, 9)
GROUP BY idUser
HAVING COUNT(DISTINCT idSkill) = 3;
you can try this query. simply select userIds and add GROUP BY to avoid repeated userIds, and if you're using more skillIds like for example (4,9,2) then change the HAVING COUNT to 3 and so on.
SELECT idUser FROM your_table
WHERE idSkill IN (4, 9)
GROUP BY idUser
HAVING COUNT(DISTINCT idSkill) = 2
One more solution:
SELECT DISTINCT idUser
FROM tablename t0
WHERE EXISTS ( SELECT NULL
FROM tablename t1
WHERE t0.idUser = t1.idUser
AND t1.idSkill = 4 )
AND EXISTS ( SELECT NULL
FROM tablename t2
WHERE t0.idUser = t2.idUser
AND t2.idSkill = 9 )
The solution can be expanded by adding more AND EXISTS ()
blocks if idSkill
values list contains more than 2 values.
And this query is sargable. fiddle
您可以使用以下MYSQL
查询进行检查:
SELECT DISTINCT(idUser) FROM skill WHERE idSkill IN(4,9)
Try this:
SELECT DISTINCT(idUser) FROM skills
WHERE idSkill = 4 and idUser IN(select idUser from skills where idSkill = 9)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.