我在搜索者工作。我有一个包含语言的多选表单,在MySQL数据库中我有一个名为USERS的表,其中所有用户都在网站上注册,另一个表名为USERS_LANGUAGES,其中包含用户在其个人资料中选择的语言。
所以,我需要查询来让用户说出在多选中选择的所有语言。
我的第一个选择是:
SELECT u.id FROM users u INNER JOIN users_languages ul ON u.id=ul.id_user AND ul.id_language IN ($multiselect options separated by comma)
但是这个查询显示了那些知道某些语言的用户,而不是所有人。
我的第二个选择是循环并为每种语言添加INNER JOIN,如下所示:
SELECT id FROM users u INNER JOIN users_languages ul_1 ON u.id=ul_1.id_user AND ul_1.id_language = 1 INNER JOIN user_languages ul_2 ON u.id=ul_2.id_user AND ul_2.id_language = 2 ...
此查询有效,但我想知道是否有更简单的查询来执行此操作。
答案 0 :(得分:0)
所以建立@CBroes评论: (我使用了一个IN子句作为例子)
SELECT u.id
FROM users u
INNER JOIN users_languages ul
ON u.id=ul.id_user
AND ul.id_language
IN ("English", "Spanish", "French", "German")
HAVING COUNT(distinct ul.id_language) = 4
所以,就像你说的,如果你匹配:
("English", "Spanish", "French", "Arabic")
即阿拉伯语而不是德语,不同的计数将是3,而不是4,因此,它不会在结果集中结束。 所以你必须每次都在count子句中发送数字。