1

我正在寻找具有连接表的 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

第一个问题是:如何搜索既是“绝地”又是“大师”的用户。第二个问题是:在 PHP 端(在数组中获取所有结果并执行一些循环以验证我想要做什么)或直接在 MySQL 查询中执行它是否更好(优化 || 可读性),知道我会必须动态构建查询(它适用于优秀用户数据库中的 PHP/MySQL 搜索引擎)。

谢谢 :) 。用户1527491

4

1 回答 1

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如果没有为each 定义唯一约束user_nameDISTINCT则需要关键字。

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
于 2013-03-03T14:06:23.460 回答