繁体   English   中英

使用Codeigniter将表中的一行与MySQL中其他两个表的多行联接

[英]Join one row from a table with multiple rows of two other tables in MySQL using Codeigniter

我见过其他类似的问题,但对我想做的事情没有真正帮助。

我有三张桌子。 sitesuser_sitessite_domains 我想从user_sitessite_domains表中查询站点以及用户和域的列表。 这是表的示例:

db.sites

+------+-------------+---------------------+--------------+
| id   | site_name   | site_options        | created_on   |
+------+-------------+---------------------+--------------+
| 1    | name1       | {serialized data}   | 10/10/12     |
+------+-------------+---------------------+--------------+
| 2    | name2       | {serialized data}   | 24/10/12     |
+------+-------------+---------------------+--------------+
| 3    | name3       | {serialized data}   | 08/09/12     |
+------+-------------+---------------------+--------------+
| 4    | name4       | {serialized data}   | 03/01/12     |
+------+-------------+---------------------+--------------+
| 5    | name5       | {serialized data}   | 10/12/11     |
+------+-------------+---------------------+--------------+

db.user_sites

+------+-----------+-----------+-----------+
| id   | user_id   | site_id   | default   |
+------+-----------+-----------+-----------+
| 1    | 1         | 1         | 0         |
+------+-----------+-----------+-----------+
| 2    | 3         | 2         | 0         |
+------+-----------+-----------+-----------+
| 3    | 1         | 3         | 0         |
+------+-----------+-----------+-----------+
| 4    | 10        | 1         | 0         |
+------+-----------+-----------+-----------+
| 5    | 5         | 1         | 1         |
+------+-----------+-----------+-----------+

db.site_domains

+------+-----------+-------------------+
| id   | site_id   | site_domain       |
+------+-----------+-------------------+
| 1    | 1         | www.domain1.com   |
+------+-----------+-------------------+
| 2    | 1         | sub.domain2.com   |
+------+-----------+-------------------+
| 3    | 3         | www.domain3.com   |
+------+-----------+-------------------+
| 4    | 2         | www.domain4.com   |
+------+-----------+-------------------+
| 5    | 3         | www.domain5.com   |
+------+-----------+-------------------+

完成后。 我希望能够填充这样的对象:

array (
    [1] => array (
        [site_name]  => 'Name1',
        [created_on] => '10/10/12',
        [site_options]    => {serialized data},
        [domains]    => array (
                            [0] => 'www.domain1.com',
                            [1] => 'www.domain2.com'
                        ),
        [users]      => array (
                            [0] => 1,
                            [1] => 10,
                            [2] => 5
                        )
    ),
    [2] => array (
        [site_name] => 'Name2',
        [created_on] => '24/10/12',
        [site_options] => {serialized data},
        [domains]    => array (
                            [0] => 'www.domain4.com'
                        ),
        [users]      => array (
                            [0] => 3
                        )
    )
)

....等等。

我正在使用Codeigniter创建我的应用程序,但是如果我只知道SQL,可以将其转换为使用Codeigniter。 SQL不是我的最佳选择,但是任何帮助将不胜感激。

如果您使用的是ActiveRecord,则交叉表查询的语法非常简单:

$this->db->select('sites.site_name');
$this->db->from('sites');
$this->db->join('sites', 'sites.id = user_sites.user_id');
$data['query'] = $this->db->get();

显然,这并不是确切的查询,因为我不知道您要在数据之间寻找什么关系,但希望您能理解。

我认为您真的很难将其纳入一个查询。

我还没有测试过,但是类似的东西可能会给你带来一些好处:

function get_site_data() {

    $sites = $this->db->get('sites')->result();

    foreach ($sites as &$row)
    {
       $row['domains'] = $this->get_domains_for_site($row->id);
       $row['users'] = $this->get_users_for_site($row->id);
    }

    return $sites;
}

function get_domains_for_site($site_id) {
    return $this->db->get_where("site_domains", array("site_id" => $site_id))->result();
}

function get_users_for_site($site_id) {
    return $this->db->get_where("user_sites", array("site_id" => $site_id))->result();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM