我会尽量切中要害。这就是我要做的。我需要从中提取数据的两个表:
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
";
这将仅返回非重复结果。