gpt4 book ai didi

MySQL - 3 个表,这个复杂的连接是否可行?

转载 作者:可可西里 更新时间:2023-11-01 08:20:05 25 4
gpt4 key购买 nike

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

  • 包含以下字段的用户表:usrID、usrName、usrPass、usrPts
  • 具有以下字段的表组:grpID、grpName、grpMinPts
  • 与字段的表关系:uID、gID

可以通过两种方式将用户放入组中:

  • 如果收集组最小点数(users.usrPts > group.grpMinPts ORDER BY group.grpMinPts DSC LIMIT 1)
  • 如果他与组的关系是手动添加到关系表中的(用户 ID 作为 uID 提供,组 ID 作为 gID 在名为 relation 的表中提供)

我可以创建一个查询,以确定每个用户(或一个特定的),他属于哪个组,但是,手动关系(使用关系表)应该比 usrPts 具有更高的优先级grpMinPts?另外,我不想让一个用户显示两次(按点显示他的真实组,但也显示相关组)...

提前致谢! :) 我试过了:

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 个案例,平均执行时间实际上是一个常数。

最佳答案

这是一种使用相关子查询获取每个值的方法。然后它使用优先规则选择适当的一个,如果 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

关于MySQL - 3 个表,这个复杂的连接是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16137695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com