MySQL“FIELD_IN_SET()”等效于“已加入”表

时间:2013-03-03 14:03:04

标签: php mysql sql join

我正在使用连接表搜索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

1 个答案:

答案 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