得到总的子项目表格,mysql / php

时间:2011-07-31 05:01:52

标签: php mysql

我有一张带有孩子culmon的桌子

如果孩子culmon = 0,那么它的主要项目,否则

该项目是另一项目的子项

表项目:

-------------------------------
id  |  title             |  child
1   | A main item 1      |   0
2   | B main item 2      |   0
3   | K child of item_2  |   2
4   | R child of item_1  |   1
5   | Q child of item_1  |   1
--------------------------------

如果可能的话,我想要一个查询来获取这样的数据:

   ---------------------------------
    + Main item 1  (total 2 childs)
        - R
        - Q
    + Main item 2  (total 1 child)
        - K

我做了很多搜索,但我没有得到它! 如果有两张桌子,我可以使用连接,但如果我只使用一张桌子,我不知道如何做到这一点..嗯,任何帮助都将是最受欢迎的..

* 编辑..我这样做了:*

我的桌子是这样的:

-------------------------------
id  |  title             |  child
1   | main_item1         |   0
2   | main_item2         |   0
3   | child item         |   1
4   | another child item |   1
5   | child for main2    |   2
--------------------------------

查询:

  SELECT *
  FROM `items` AS `t1`
  INNER JOIN `items` AS `t2`

  WHERE `t1`.`child` = `t2`.`id` and t2.user_id = $user_id

我得到了这个:

-main_item_1
-main_item_1
-main_item2

任何帮助?

------------------------已解决! --------------------------------------------

抱歉,我无法回答自己的问题,所以我在这里编辑了我的问题..

谢谢你们的帮助..

感谢@Shi(我为他的代码做了更改:))

我只是做了这个简单的查询来获取每个主要项目的所有主要项目和子项总数..像这样:

  SELECT *,
     (SELECT COUNT(1)
      FROM `items`
      WHERE child = t1.id )
      AS  total_childs

  FROM `itmes` AS `t1`
  where `t1`.`child` = 0

  GROUP BY t1.id 

我得到这样的数据:

  • main_item1(总孩子数:2)
  • main_item2(总孩子数:1)

然后我做了另一个查询来获取所有项目(子项目)

在模板页面内部我只写IF语句来获取每个项目的子项 这样的事情(我使用Smarty模板);

{foreach from=$items item=i} 
{$i.title} ( total children : {$i.total_childs} )

// did another foreach to get children 
{foreach from=$children item=c} 
  {if $c.child eq $i.id}
  <li> {$c.title} </li>
  {/if}
{/foreach}


{/foreach}

当然,如果有更好的方法可以做到这一点,如果有人帮助我们,这很好:)

再次感谢..

3 个答案:

答案 0 :(得分:1)

您需要自己加入表格:

SELECT * FROM`table` AS`t1`INNER JOIN`table`AS`t2` ON`t1` .child` =`t2``id`;

如果您想存储更大更深的嵌套树,我建议您使用nested sets

答案 1 :(得分:1)

例如,如果您想获得id 1的孩子数,请使用此查询

select count(child) from Items where child ='1' 

获取id 1的孩子的标题然后使用此查询

select title from Items where child ='1' 

要计算按child值分组的所有行的子项数,请使用

select count(id),child from Items where child in (1,2,3,4,5) group by child

以下查询将显示所有子元素

SELECT t1.id, t1.title, t1.child
FROM `Items` AS `t1`
INNER JOIN `Items` AS `t2`
WHERE `t1`.`child` = `t2`.`id`
AND t1.id
IN ( 1, 2, 3, 4, 5 )

答案 2 :(得分:0)

它不适用于树,但如果孩子总是&gt;则应该适用于2级ID:

$lastid=-1,$names=array();
$a=mysql_query('SELECT * FROM tblname ORDER BY child ASC');
while($b=mysql_fetch_assoc($a)){
    if(!$b['child']){
         $names[$b['id']]=$b['name']; continue;
    }
    if($lastid!=$b['child'])
        print 'Childs of '.$names['child'].'<br>';
    print $b['name'].'<br>';
    $lastid=$b['child'];
}