2011-07-13 35 views
2

我有一个数据模式是这样的:结构PHP数据

cp 
    id te su 
    1  7  2 
    2  7  1 
    3  6  8 

cl 
    id cp st 
    1  2  5 
    2  2  6 
    3  1  6 

us 
    id na 
    .. .. 
    5  Joe 
    6  Mike 
    7  Tina 
    .. .. 

我想与foo(7)从MySQL

运行PHP函数 foo($te)像这样的输出数据
[0] 
    su: 1 
    st_list: 
     [0] 
      id:6 
      na:Mike 
[1] 
    su: 2 
    st_list: 
     [0] 
      id:5 
      na:Joe 
     [1] 
      id:6 
      na:Mike 

我想知道如何最好地做到这一点。现在我能够使用连接,但结果看起来像这样

[0] 
    su: 1 
    st_id:6 
    st_na:Mike 
[1] 
    su: 2 
    st_id:5 
    st_na:Joe 
[3] 
    su: 2 
    id:6 
    na:Mike 

su:2重复......显然这不是在这个例子中的一个问题,问题是,在现实的事情, su代表更多的数据,我会通过“this”(无论我选择哪种答案)方法。

编辑: 我希望你明白我在问什么......我知道很多你们的是方式的MySQL和一般的比我更多的发展见地的,所以这就是为什么我要问在这样的一个普通的(我有这种想法),因为我认为如果我有更具体的问题,我最终会对它应该运行的方式做出假设)。我想要一个有效的解决方案,因为这些数据正被用来填充搜索结果。

谢谢!!!!!!!!!!

+0

你将需要使这些更描述性命名,你应该有一个更具描述性的期望输出。 – cwallenpoole

+0

问题是什么? –

回答

5

您将需要自行循环播放结果,并以您想要的格式构建数组。 MySQL不能以你想要的嵌套格式给你结果。这里有一个粗略的草稿(未经测试):

$su = 0; 
$st_list = array(); 
$nested = array(); 
foreach ($results as $row) { 
    if ($su != 0 && $row['su'] != $su) { 
     $nested[] = compact('su', 'st_list'); 
    } 

    if ($su != $row['su']) { 
     $su = $row['su']; 
     $st_list = array(); 
    } 

    $st_list[] = array(
     'id' => $row['st_id'], 
     'na' => $row['st_na'], 
    ); 
} 

$nested[] = compact('su', 'st_list'); 

编辑:通常最好简单地获取所有你想使用一个SQL查询的结果。这几乎总是最有效的方式。但是,如果它真的对你很重要(并且这是你的应用程序中性能至关重要的部分),那么肯定知道的唯一方法就是对这两种方法进行基准测试。很大程度上取决于您的数据库布局,行数,SQL索引等。

+0

我必须遍历结果来构建所需的结构,但对我来说最好是使用JOINS获取所有数据,然后通过它进行筛选,或者我应该在循环中使用多个查询和查询以仅“获取”我将要使用的数据(即不是获取重复'su:2'的 – mazlix

+0

我已经更新了我的回答。 –

+0

好吧,谢谢..我不确定更多的数据与更多的命中之间的关系,但最终更小的数据往往是更有效...奖金问题(如果你愿意):我会添加一个'加入su = ___'b/c的副本'苏'的任何问题?(如果不,那么我可能会这样做) – mazlix

0
SELECT distinct us.id,na FROM cp 
LEFT JOIN cl ON cp.su = cl.cp 
LEFT JOIN us ON us.id = cl.st 
where te = "7" 

这是否提供您要查找的结果?

或者,

SELECT su,us.id,na FROM cp 
LEFT JOIN cl ON cp.su = cl.cp 
LEFT JOIN us ON us.id = cl.st 
where te = "7" 
ORDER BY su 

更接近你在你的岗位要求的格式。

0

在你的模型,你可以像这些太...

function get_te($te) 
{ 
    $qry = $this->db->get_where('cp', array('te' => $te)); 
    $raw_te = $qry->result_array(); 
    $te = array(); 
    $i = 0; 
    while($i < count($raw_te)) 
    { 
     $te[$i]['su'] = $raw_te[$i]['su']; 
     $qry = $this->db->select('*') 
         ->from('cl') 
         ->join('us', 'us.id = cl.id') 
         ->where('cp', $raw_te[$i]['id']) 
         ->get(); 
     $te[$i]['st_list'] = $qry->result_array(); 
     $i++; 
    } 
    return $te; 
}