SQL查询是否基于给定列中的值连接不同的表?
我正在为我的网站设计一个领域模型和数据映射系统。系统具有不同类型的用户域对象,基类用于用户,子类用于管理员、mods和被禁止用户。每个域对象都使用一个名为“users”的表中的数据,而子类有一个额外的表来存储admin/mod/banked信息。用户类型由“users”表中名为“userlevel”的列确定,其值为3(管理员)、2(mods)、1(注册用户)和-1(禁止用户) 现在,当我为我的站点使用成员列表功能时,出现了一个问题,因为成员列表应该从数据库加载所有用户(使用分页,但现在不必担心这一点)。问题是我想从基本用户表和附加的admin/mod/banked表加载数据。正如您所看到的,注册用户没有额外的表来存储额外的数据,而对于admin/mod/banked用户,该表是不同的。此外,这些表中的列也不同SQL查询是否基于给定列中的值连接不同的表?,sql,database,Sql,Database,我正在为我的网站设计一个领域模型和数据映射系统。系统具有不同类型的用户域对象,基类用于用户,子类用于管理员、mods和被禁止用户。每个域对象都使用一个名为“users”的表中的数据,而子类有一个额外的表来存储admin/mod/banked信息。用户类型由“users”表中名为“userlevel”的列确定,其值为3(管理员)、2(mods)、1(注册用户)和-1(禁止用户) 现在,当我为我的站点使用成员列表功能时,出现了一个问题,因为成员列表应该从数据库加载所有用户(使用分页,但现在不必担心这
那么,我应该如何使用SQL查询来处理这种情况呢?我知道我可以简单地从基本用户表中选择,然后使用多个查询加载附加数据(如果发现用户级别为给定值),但这是一个坏主意,因为这将导致n个管理员/mods/被禁止用户的n+1查询,这是一次非常昂贵的数据库访问。我还能做什么?请帮忙 如果您想通过一次查询查询所有用户类型,您必须让结果表中所有表中的列都填写
null
-值
要让它们充满数据,请使用如下左连接:
SELECT *
FROM userdata u
LEFT OUTER JOIN admindata a
ON ( u.userid = a.userid
AND u.usertype = 3 )
LEFT OUTER JOIN moddata m
ON ( u.userid = m.userid
AND u.usertype = 2 )
LEFT OUTER JOIN banneddata b
ON ( u.userid = b.userid
AND u.usertype = -1 )
WHERE...
您可能会删除usertype
-条件,因为其中一个联接表中应该只有数据,但您永远不知道
然后,程序代码将根据usertype
选择正确的列
注意:
select*
并不是为了简单起见,在真实代码中最好列出所有列名…虽然在您的域类中使用此层次结构是完全可以的,但我建议更改数据库中的方法。否则,您的查询将非常复杂和缓慢
您可以只使用另一个名为“users\u additional\u info”的表,该表包含所有用户类型所需的混合列。那你就可以了
SELECT * FROM users
LEFT JOIN users_additional_info ON users.id = users_additional_info.user_id
在一个简单的查询中获取所有信息。信不信由你,当您的表开始增长或您决定添加其他类型的用户时,这种方法将为您节省很多麻烦。注意,我已经检查了类似的问题,但我的问题完全不同,因为我正在加载表中的所有数据(选择*查询),而不仅仅是特定列。这给我的问题带来了更多的复杂性,因为返回的每一行的列数可能不同。叹息