3

我有三个表:用户、组和关系。

  • 具有字段的表用户: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 个案例,平均执行时间实际上是一个常数时间。

4

2 回答 2

3

这是一种使用相关子查询来获取每个值的方法。然后它使用优先规则选择适当的一个,如果relations存在则使用该优先规则,否则使用组表中的一个:

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 gid from relations r where r.userId = u.userId
             ) as relationgroupid
      from users u
    ) u
于 2013-04-22T00:35:08.780 回答
0

尝试这样的事情

select user.name, group.name
from group
join relation on relation.gid = group.gid
join user on user.uid = relation.uid
union
select user.name, g1.name
from group g1
join group g2 on g2.minpts > g1.minpts
join user on user.pts between g1.minpts and g2.minpts
于 2013-04-22T01:05:31.023 回答