一个操作三个 MySQL 个查询!?我想不是

Three MySQL queries for one operation!? I think not

我会尽量切题。这就是我想要做的。 我有两个 table 需要从中提取数据:

membershipstable = || groupid || templateid || userid
                   ||    2    ||      1     ||   0
                   ||    0    ||      1     ||   3
                   ||    2    ||      0     ||   4

userstable = || id || firstname || lastname || email

我想做的是:

SELECT * FROM userstable WHERE id = userid (in memberships table) -- AND/OR --  WHERE id = userid IF groupid is associated with templateid, and templateid is equal to $currenttemplateid

或者用人类的话说:查看 memberships table,如果找到包含匹配 $currenttemplateidtemplateid 的行,则带回 userid 从那一行。然后,查看 userstable 并检索具有 id 与我们在上面找到的 userid 相匹配的每个用户的信息。此外,如果您发现任何包含匹配 $currenttemplateidtemplateid 的行,则查看该行中的 groupid 并带回任何行中的任何 userid groupid,然后再次检索 id 与上面找到的 userid 相匹配的任何用户的信息。

如果我的解释有些混乱,如果我的问题有点新鲜(另外,别担心,我在实际项目中没有使用未经准备的陈述),我很抱歉...我知道这可以在单个、高效且漂亮的查询中使用 MySQL 完成,但我完全不知道该查询到底是什么样子...非常感谢您的帮助。 :)

使用三向加入查找与所选成员在同一组中的所有用户。

SELECT u.*
FROM usertable AS u
JOIN membershiptable AS m1 ON u.id = m1.userid
JOIN membershiptable AS m2 ON m1.groupid = m2.groupid
WHERE m2.templateid = $currenttemplateid

DEMO

对于以后可能会来寻找答案的人来说,如果用户已分配给模板和组,则可能会在 return 中出现重复条目也分配给模板。一个解决方案是将 DISTINCT 直接放在查询的 SELECT 部分之后。例如

$query = "
        SELECT DISTINCT
            u.id,
            u.firstname,
            u.lastname,
            u.username,
            u.email
        FROM $userstable AS u
        INNER JOIN $membershipstable AS M1 ON u.id = M1.userid
        INNER JOIN $membershipstable AS M2 ON M1.groupid = M2.groupid
        WHERE M2.templateid = :currenttemplateid
    ";

这 return 只有非重复结果。