2014-03-05 77 views
0

如何在SQL中输入这2个表,表a和表b。SQL表连接

table a: 

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


table b: 

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

所以我想从表中所有的值。 我也想从B表数据2和value = true其中a.id = b.a_id. 如果从表中的数据并没有从表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 } ?> 
+1

你不需要算法,只是学习的查询语句如选择,加盟,联合等.. – user1844933

+0

你们怎么做那灰暗的东西?我在这里是新的 – SidlakMonster

+0

虽然我没有太多时间了解这一点。我仍然有东西要学习和做。也许在这个项目之后。 – SidlakMonster

回答

3

试着这么做

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检查值是否为空,如果不是,则返回值,否则返回第二个参数,在此例中为false

IF函数的工作方式类似于if语句,如果相等为真则返回第一个参数,如果不是,则返回第二个参数。

我假设b.data2可以为空,没有一个详细的表结构它都是猜测。

+0

这只会得到b.data2存在的数据。 我也想检索b.data不存在的数据,它会在里面返回一个带有false的值。 – SidlakMonster

+0

@ user3382461请问您可以澄清一下,data2包含true或false或0 – Prafulla

+0

@ user3382461更新了答案,但再次阅读了问题,“value”列在哪里?我假设你指的是'b.data2'的值,但请澄清。 – Kami

0

尝试此查询

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它会简单为您

+0

这只会检索b1.data1存在的值。我也想从a1获取数据,其中b1.data1 = false – SidlakMonster

+0

@ user3382461删除条件即可以使用或者'data2 = true或data2 = false' – Prafulla

0
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 

有点粗糙,也许不包含所有需要的数据尽管这是我从你给我的最好推断,并应该给你一个好的起点加入。对不起,我无法测试它,因为我目前没有环境。

您使用时要链接2个表,其中两者的标准相匹配的内部联接:a.id = b.id

如果您不需要它们匹配,你会使用外连接。 更多资源:

+0

如果我想要从a只有一部分来自b。如果这个b不存在,它会作为数据发布false? – SidlakMonster

+0

左边的外部连接表b上a.id = b.id –

+0

你可以检查我的代码吗?我只是编辑了OP – SidlakMonster