我正在使用连接表搜索MySQL“FIELD_IN_SET()”的等价物。这是我想要做的一个例子。
我有三张桌子。第一个包含字段“user_id”和“user_name”。第二个包含字段“id”,“user_id”和“role_id”。第三个包含“id”,“role_name”。
我想搜索拥有两个不同指定角色的用户。在LEFT JOIN之后,我的表格将如下所示:
user_id - user_name - role_name
12 - Yoda - jedi
12 - Yoda - master
15 - Obi-Wan Kenobi - jedi
第一个问题是:如何搜索“jedi”和“master”的用户。 第二个问题是:在PHP方面做得更好(优化||可读性)(在数组中获取所有结果并做一些循环来验证我想要做什么)或直接在MySQL查询中,知道我会必须动态构建查询(它适用于优秀用户数据库中的PHP / MySQL搜索引擎)。
谢谢:)。 user1527491
答案 0 :(得分:1)
此问题称为RELATION DIVISION
SELECT a.user_name
FROM firstTable a
INNER JOIN secondTable b
ON a.user_ID = b.user_ID
INNER JOIN thirstTable c
ON b.role_ID = c.role_ID
WHERE c.role_NAME IN ('jedi', 'master')
GROUP BY a.user_name
HAVING COUNT(*) = 2
如果没有为每个role_NAME
user_name
定义唯一约束,则需要DISTINCT
个关键字。
SELECT a.user_name
FROM firstTable a
INNER JOIN secondTable b
ON a.user_ID = b.user_ID
INNER JOIN thirstTable c
ON b.role_ID = c.role_ID
WHERE c.role_NAME IN ('jedi', 'master')
GROUP BY a.user_name
HAVING COUNT(DISTINCT c.role_NAME) = 2