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


Three MySQL queries for one operation!? I think not

我会尽量切中要害。这就是我要做的。我需要从中提取数据的两个表:

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表,如果您发现一行包含与$currenttemplateid匹配的templateid,则从该行中带回userid。然后,查看userstable并检索具有与上面找到的userid匹配id的每个用户的信息。此外,如果找到包含与$currenttemplateid匹配的templateid的任何行,请查看该行中的groupid并带回具有该groupid的任何行中的任何userid,然后再次检索具有与上面找到的userid匹配id的任何用户的信息。

如果我的

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

使用 3 向联接查找与所选成员位于同一组中的所有用户。

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

演示

对于以后可能来寻找答案的任何人,如果用户同时被分配到模板和也分配给模板的组,则担心最终会在返回中出现重复条目。解决此问题的解决方案是将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
    ";

这将仅返回非重复结果。