主表  - 信息如下
id    title            times
1     主表信息   2012-02-02状态1表 -  信息 如下
id  主表.id    状态    times
1   1            正常    2012-02-02 12:12
2   1            接受    2012-02-02 12:22
3   1            出错    2012-02-02 12:32
4   1            正常    2012-02-02 12:42状态2表 -  信息 如下
id    主表.id    状态    times
11   1            收到    2012-02-02 15:12
12   1            发出    2012-02-02 15:22
13   1            未读    2012-02-02 15:32
14   1            已读    2012-02-02 15:42请问怎样 用一条SQL获得 主表的记录以及 关联表的 所有记录。也就是得到上述 表中的查询结果,谢谢!

解决方案 »

  1.   

    补充一下,附属表里也可以没有信息。我用joinleft 查询得不到理想的效果!
      

  2.   

     array{
        [0] => { // 按照上述表中查出的结果
          ["id"] =>"1"
          ["title"] => "主表信息"
          ["times"] => "2012-02-02"
          ["状态1"]=>array{
             [0]=>{
                    ["id"] =>"1"
                    ["title"] => "正常"
                    ["times"] => "2012-02-02"
             }
             [2]=>{
                    ["id"] =>"2"
                    ["title"] => "接受"
                    ["times"] => "2012-02-02"
             }
             [3]=>{
                    ["id"] =>"3"
                    ["title"] => "出错"
                    ["times"] => "2012-02-02"
             }
             [4]=>{
                    ["id"] =>"4"
                    ["title"] => "正常"
                    ["times"] => "2012-02-02"
             }
          }
          ["状态2"]=>array{
             [0]=>{
                    ["id"] =>"11"
                    ["title"] => "收到"
                    ["times"] => "2012-02-02"
             }
             [2]=>{
                    ["id"] =>"12"
                    ["title"] => "发出"
                    ["times"] => "2012-02-02"
             }
             [3]=>{
                    ["id"] =>"13"
                    ["title"] => "未读"
                    ["times"] => "2012-02-02"
             }
             [4]=>{
                    ["id"] =>"14"
                    ["title"] => "已读"
                    ["times"] => "2012-02-02"
             }
          }
        }
        [1] => { // 这里是没有附属状态的情况
          ["id"] =>"2"
          ["title"] => "主表信息2"
          ["times"] => "2012-02-03"
          ["状态1"]=>array{}
          ["状态2"]=>array{}
        }
        …………………………………………………………
      

  3.   

    joinleft 联合查询的结果 全部是分散的,没有汇总进去
      

  4.   


    报表格式 我已经给出了 数组。3#和下方都是 期望格式array{
      [0] => { // 按照上述表中查出的结果
      ["id"] =>"1"
      ["title"] => "主表信息"
      ["times"] => "2012-02-02"
      ["状态1"]=>array{
      [0]=>{
      ["id"] =>"1"
      ["title"] => "正常"
      ["times"] => "2012-02-02"
      }
      [2]=>{
      ["id"] =>"2"
      ["title"] => "接受"
      ["times"] => "2012-02-02"
      }
      [3]=>{
      ["id"] =>"3"
      ["title"] => "出错"
      ["times"] => "2012-02-02"
      }
      [4]=>{
      ["id"] =>"4"
      ["title"] => "正常"
      ["times"] => "2012-02-02"
      }
      }
      ["状态2"]=>array{
      [0]=>{
      ["id"] =>"11"
      ["title"] => "收到"
      ["times"] => "2012-02-02"
      }
      [2]=>{
      ["id"] =>"12"
      ["title"] => "发出"
      ["times"] => "2012-02-02"
      }
      [3]=>{
      ["id"] =>"13"
      ["title"] => "未读"
      ["times"] => "2012-02-02"
      }
      [4]=>{
      ["id"] =>"14"
      ["title"] => "已读"
      ["times"] => "2012-02-02"
      }
      }
      }
      [1] => { // 这里是没有附属状态的情况
      ["id"] =>"2"
      ["title"] => "主表信息2"
      ["times"] => "2012-02-03"
      ["状态1"]=>array{}
      ["状态2"]=>array{}
      }
      …………………………………………………………
      

  5.   


    我用leftjoin 查询的每个都是分开的记录。
      

  6.   

    本来就该分开……mysql_fetch_……返回一行数据,可不是一个集合。数据格式加工可以在php中处理。
      

  7.   

    求解  union 怎么实现上述 数据结构
      

  8.   

    这种格式一条语句几乎不可能
    建议还是先查询主表的记录后,遍历他们分别取得每种状态的记录,然后加入到记录中
    $list=主表结果集;
    foreach($list as $key=>$value)
    {
    $id=$value["id"];//主表id
    $list1=根据主表id得到的状态1表结果集;
    $list2=根据主表id得到的状态2表结果集;
    $list[$key]["状态1"]=$list1;
    $list[$key]["状态2"]=$list2;
    }
      

  9.   

    也就是必须 3条SQL搞定?
    我看 有人说 union可以,不知道语句该怎么写
      

  10.   

    写写看,没执行过,不过看数据结构应该是可以的select a."id","主表.id",title "状态" "a.times"
    from 状态1表 a, 主表 b
    where a."主表.id"=b.id
    union
    select a."id","主表.id",title "状态" "a.times"
    from 状态2表 a, 主表 b
    where a."主表.id"=b.id想来,你应该不关心主表的times数据吧,另外使用union要求状态1表和2表的字段要由相同的数据类型
      

  11.   


    感谢,测试跑了一下,得到的数据结果都是平行的。应该是在总记录增加一个字段 “状态”,该状态内拥有所以级联查询数组。array{
      [0] => { // 按照上述表中查出的结果
      ["id"] =>"1"
      ["title"] => "主表信息"
      ["times"] => "2012-02-02"
      ["状态1"]=>array{
                                 [0]=>{
                                              ["id"] =>"1"
                                              ["title"] => "正常"
                                              ["times"] => "2012-02-02"
                                          }
                                  [1]=>{
                                              ["id"] =>"2"
                                              ["title"] => "正常"
                                              ["times"] => "2012-02-02"
                                          }..............................是这样的数据结构
      

  12.   


    感谢,测试跑了一下,得到的数据结果都是平行的。应该是在总记录增加一个字段 “状态”,该状态内拥有所以级联查询数组。array{
      [0] => { // 按照上述表中查出的结果
      ["id"] =>"1"
      ["title"] => "主表信息"
      ["times"] => "2012-02-02"
      ["状态1"]=>array{
    --------------------[0]=>{
    ----------------------------["id"] =>"1"
    ----------------------------["title"] => "正常"
    ----------------------------["times"] => "2012-02-02"
    ----------------------------}
    --------------------[1]=>{
    ----------------------------["id"] =>"2"
    ----------------------------["title"] => "正常"
    ----------------------------["times"] => "2012-02-02"
                                          }..............................
      

  13.   

    按照上述的union还是得不到 以上的数据结构,请问还有其他方法吗??
      

  14.   

    好吧   用union帮你写(select '主表' as `所属表`,`id`,`title`,`times` from 主表)
    union all
    (select '状态1表' as `所属表`,`id`,状态 as `title`,`times` from 状态1表 where 主表.id in (select `id` from 主表))
    union all
    (select '状态2表' as `所属表`,`id`,状态 as `title`,`times` from 状态2表 where 主表.id in (select `id` from 主表))大致就是这样
    其实union分解开来也就是查询三张表,只不过可以用一条语句完成就是了注意
    查询得到的结果集,并不是你想要的结构,其中的“所属表”字段是告诉你当前记录的所属表
    最后你就需要用复杂的遍历操作去过滤拼接整理来得到你想要的格式(这里就要用到“所属表”)
      

  15.   

    我写错了(select '主表' as `所属表`,`id`,'0' as 主表.id,`title`,`times` from 主表)
    union all
    (select '状态1表' as `所属表`,`id`,主表.id,状态 as `title`,`times` from 状态1表 where 主表.id in (select `id` from 主表))
    union all
    (select '状态2表' as `所属表`,`id`,主表.id,状态 as `title`,`times` from 状态2表 where 主表.id in (select `id` from 主表))漏了个字段(在遍历匹配时,这个字段也是必须)