Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询是否基于给定列中的值连接不同的表?_Sql_Database - Fatal编程技术网

SQL查询是否基于给定列中的值连接不同的表?

SQL查询是否基于给定列中的值连接不同的表?,sql,database,Sql,Database,我正在为我的网站设计一个领域模型和数据映射系统。系统具有不同类型的用户域对象,基类用于用户,子类用于管理员、mods和被禁止用户。每个域对象都使用一个名为“users”的表中的数据,而子类有一个额外的表来存储admin/mod/banked信息。用户类型由“users”表中名为“userlevel”的列确定,其值为3(管理员)、2(mods)、1(注册用户)和-1(禁止用户) 现在,当我为我的站点使用成员列表功能时,出现了一个问题,因为成员列表应该从数据库加载所有用户(使用分页,但现在不必担心这

我正在为我的网站设计一个领域模型和数据映射系统。系统具有不同类型的用户域对象,基类用于用户,子类用于管理员、mods和被禁止用户。每个域对象都使用一个名为“users”的表中的数据,而子类有一个额外的表来存储admin/mod/banked信息。用户类型由“users”表中名为“userlevel”的列确定,其值为3(管理员)、2(mods)、1(注册用户)和-1(禁止用户)

现在,当我为我的站点使用成员列表功能时,出现了一个问题,因为成员列表应该从数据库加载所有用户(使用分页,但现在不必担心这一点)。问题是我想从基本用户表和附加的admin/mod/banked表加载数据。正如您所看到的,注册用户没有额外的表来存储额外的数据,而对于admin/mod/banked用户,该表是不同的。此外,这些表中的列也不同


那么,我应该如何使用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

在一个简单的查询中获取所有信息。信不信由你,当您的表开始增长或您决定添加其他类型的用户时,这种方法将为您节省很多麻烦。

注意,我已经检查了类似的问题,但我的问题完全不同,因为我正在加载表中的所有数据(选择*查询),而不仅仅是特定列。这给我的问题带来了更多的复杂性,因为返回的每一行的列数可能不同。叹息