Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.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/5/sql/75.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
Php 如何高效地用sql查询多个表中的子记录?_Php_Sql_Codeigniter - Fatal编程技术网

Php 如何高效地用sql查询多个表中的子记录?

Php 如何高效地用sql查询多个表中的子记录?,php,sql,codeigniter,Php,Sql,Codeigniter,我们有一个简单的数据库。用户表包含用户。Accounts表为每个用户保存多个帐户。“主题”表包含每个帐户的多个主题 因此,一个用户将有多个帐户,每个帐户将有多个主题。那么,如果我有一个id=1的用户,我如何高效地查询所有3个表以获取该用户的所有帐户和主题 我目前使用的foreach循环运行许多sql查询。有没有办法只运行一个sql查询就可以得到我想要的东西 以下是我当前使用的代码(即CodeIgniter代码): 简单的一对多加上另一对多 用户->多个帐户 帐户->多个主题 想想你的用户表,一行

我们有一个简单的数据库。用户表包含用户。Accounts表为每个用户保存多个帐户。“主题”表包含每个帐户的多个主题

因此,一个用户将有多个帐户,每个帐户将有多个主题。那么,如果我有一个id=1的用户,我如何高效地查询所有3个表以获取该用户的所有帐户和主题

我目前使用的foreach循环运行许多sql查询。有没有办法只运行一个sql查询就可以得到我想要的东西

以下是我当前使用的代码(即CodeIgniter代码):


简单的一对多加上另一对多

用户->多个帐户

帐户->多个主题

想想你的用户表,一行是唯一的(包含一个用户,比如Jon Doe)。 设想您的accounts表引用某种类型的用户(即多个帐户可以包含同一个用户,此外,account Acme 1和Acme 2都属于用户Jon Doe)。 最后,考虑包含帐户引用的topics表。也就是说,每个主题都有一个帐户id。这意味着帐户有许多与其关联的主题

SELECT
   u.UserID,
   a.Account
   t.Topic
FROM 
    Users u
INNER JOIN 
     Accounts a
ON u.UserID = a.UserID
INNER JOIN
     Topics t
ON t.AccountID = a.AccountID
如果要缩小一个用户的范围,只需添加一个
WHERE
子句:

SELECT
   u.UserID,
   a.Account
   t.Topic
FROM 
    Users u
INNER JOIN 
     Accounts a
ON u.UserID = a.UserID
INNER JOIN
     Topics t
ON t.AccountID = a.AccountID
WHERE u.UserID=1
是基本查询,不确定CI

如果您需要来自成员id的其他信息,则:

SELECT usr.`id`, acc.`account_id`, top.`topic_id` [etc]
FROM `users` usr
JOIN `accounts` acc ON (acc.`member_id` = usr.`id`)
JOIN `topics` top ON (top.`account_id` = acc.`id`)
WHERE usr.`id` = 1

您正在寻找SQL联接吗?或者更优雅的PHP语法使用codeignitor?应该在SQL方面做得更多,这是一个数据问题而不是UI问题。如果其中一个帐户还没有任何主题怎么办?你还不想找回那个账户吗?条款也是如此。如果一个主题没有任何术语怎么办?是否仍要检索该主题?也许这些情况是不可能的,但如果可能的话,它们是重要的细节。@chris-那么你应该使用一个左joint,它工作得很好,尽管它似乎希望“a.Account”和“t.Topic”是Accounts和Topics表中的特定字段。我可以使用“'SELECT u.id as user\u id,a.id as account\u id,t.id as topic\u id…”来获取特定字段,但是有没有一种方法可以选择整个记录而不必指定每个字段?如果您想要每个记录,可以通配符选择u.*,t.*。。。等等。虽然我不建议使用通配符…您应该始终列出每个字段,但我从下面的dkantowitz获得:“选择u.*,a.*,t.*”
SELECT top.`topic_id` [etc]
FROM `accounts` acc
JOIN `topics` top ON (top.`account_id` = acc.`id`)
WHERE acc.`member_id` = 1
SELECT usr.`id`, acc.`account_id`, top.`topic_id` [etc]
FROM `users` usr
JOIN `accounts` acc ON (acc.`member_id` = usr.`id`)
JOIN `topics` top ON (top.`account_id` = acc.`id`)
WHERE usr.`id` = 1