繁体   English   中英

SQL表联接

[英]SQL table joins

我如何在SQL中输入获得这2个表(表a和表b)的位置。

table a: 

+----+-------+--------+--------+
| id |  name |  data1 |  data2 |
+----+-------+--------+--------+


table b: 

+----+------------+-------+--------+--------+
| id |  member_id |  a_id |  data1 |  data2 |
+----+------------+-------+--------+--------+

所以我想从表a中获取所有值。 我也想从a.id = b.a_id.表b中获取data2和value = true a.id = b.a_id. 如果表a中的数据没有表b中a.id = b.a_id, data2 = 0, value = false.

如果这一切都可以使用SQL进行,那将是很好的,但如果不是,至少要告诉您如何使用PHP或codeigniter解决问题,或者只是发表您的概念/算法。 先感谢您。

编辑2:

好吧,我明白了。 感谢下面分享想法的每个人。 他们提供了很多帮助:

模型:

    function getData2(){
    $id = $this->uri->segment(3);
    $this->db->select("t.*, mt.mid as mid, mt.amt as mtamt");
    $this->db->from("transaction as t");
    $this->db->join("mtrans as mt", "mt.tid = t.id and mt.mid = '$id'", "left outer");
    $query = $this->db->get();
    $data['info2'] = $query->result_array();

    return $data;
}

视图:

<?php foreach ($info2["info2"] as $record) { ?>
        <tr>
            <td><?php echo $record["id"]; ?></td>
            <td><?php echo $record["name"]; ?></td>
            <td><?php echo $record["type"]; ?></td>
            <td><?php echo $record["amt"]; ?></td>
            <?php foreach ($info1["info1"] as $stat) { 
                if($record["mid"] == $this->uri->segment(3)){?>
            <td><?php echo $stat["mtamt"]; ?></td>
            <td><?php echo $stat["user"]; ?></td>
            <td><?php
            if(!$stat["mtamt"]){
                echo "Unpaid";
            }
            if($stat["mtamt"] < $record["amt"]){
                echo "Partial";
            }
            if($stat["mtamt"] == $record["amt"]){
                echo "Paid";
            }
            ?></td>

            <?php } } ?>
        </tr>
        <?php } ?>

尝试类似

select
  a.*,
  IFNULL(b.data2, 0) as b_data2,
  IF(b.data2 IS NULL, false, true) as value
from a left outer join b
on a.id = b.a_id

它基于键将两个表连接在一起并检索相关记录。

更新为允许空值。 IFNULL检查值是否为null,如果不为null,则返回value,否则返回第二个参数,在这种情况下为false

IF函数的作用类似于if代码语句,如果相等为true,则返回第一个参数,否则为第二个参数。

我假设b.data2可以为null,没有详细的表结构,这全是猜测。

试试这个查询

SELECT a1.id, a1.name, a1.data1, a1.data2, (b1.data2) data FROM a a1
INNER JOIN b b1 ON b1.id= a1.a_id
WHERE b1.data2 = true

我把别名到第二个表的属性作为data它会简单的给你

select 
a.id, 
a.name, 
a.data1,
a.data2
from tablea a 
inner join (select * from table b where data2 = True) b on a.id = b.id

虽然这是我从您提供的数据中得出的最好的数据,但它可能并不包含您所需的所有数据,这应该是您进行联接的一个很好的起点。 抱歉,因为我目前没有环境,所以无法测试。

当您要链接两个条件都匹配的表时,可以使用内部a.id = b.ida.id = b.id

如果不需要它们匹配,则可以使用外部联接。 更多资源:

暂无
暂无

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

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