我有三个表:用户、组和关系。
- 具有字段的表用户:usrID、usrName、usrPass、usrPts
- 具有字段的表组:grpID、grpName、grpMinPts
- 与字段的表关系:uID、gID
可以通过两种方式将用户置于组中:
- 如果收集组最小点数(users.usrPts > group.grpMinPts ORDER BY group.grpMinPts DSC LIMIT 1)
- 如果他与组的关系是手动添加到关系表中的(用户 ID 作为 uID 提供,组 ID 在名为关系的表中作为 gID 提供)
我可以创建一个查询,以确定每个用户(或特定用户)属于哪个组,但是与 grpMinPts 相比,手动关系(使用关系表)应该比 usrPts 具有更高的优先级?另外,我不想让一个用户显示两次(按点显示他的真实组,但也显示相关组)......
提前致谢!:) 我试过了:
SELECT * FROM users LEFT JOIN (relation LEFT JOIN groups ON (relation.gID = groups.grpID) ON users.usrID = relation.uID
使用它我设法提取指定的关系(从关系表中),但是,我不知道如何包含用户点,尊重上述优先级(首先指定)。我知道如何在 php 中的几个单独的查询中做到这一点,这很简单,但我很好奇,可以使用一个查询来完成吗?
编辑添加:
多亏了使用coalesce @GordonLinoff 提供的真正教育技术,我设法使这个查询按预期工作。所以,这里是:
SELECT o.usrID, o.usrName, o.usrPass, o.usrPts, t.grpID, t.grpName
FROM (
SELECT u.*, COALESCE(relationgroupid,groupid) AS thegroupid
FROM (
SELECT u.*, (
SELECT grpID
FROM groups g
WHERE u.usrPts > g.grpMinPts
ORDER BY g.grpMinPts DESC
LIMIT 1
) AS groupid, (
SELECT grpUID
FROM relation r
WHERE r.userUID = u.usrID
) AS relationgroupid
FROM users u
)u
)o
JOIN groups t ON t.grpID = o.thegroupid
另外,如果您像我一样想知道,这种方法是比在 php 中执行三个查询和处理更快还是更慢,答案是这种方法稍微快一些。此查询执行和在网页上显示结果的平均时间为 14 毫秒。三个简单的查询,用 php 处理并在网页上显示结果花了 21 毫秒。平均值基于 10 个案例,平均执行时间实际上是一个常数时间。