【问题标题】:php mysql : How to list two tables with related data?php mysql:如何列出两个具有相关数据的表?
【发布时间】:2013-08-31 11:35:51
【问题描述】:

我有一个简单的树结构输出问题,

一开始我用了两个mysql_query,一个是获取pro_class的数据,包含pro_class.cid,通过cid查询下一张表,比如:

mysql_query("select * from pro_class ");
mysql_query("select * from pro where cid='pro_class.cid' ");

但我想使用一个查询,我该如何完成?

表:pro_class

cid 标题 时间

1  人 2013/8/31

4  CAR   2013/8/30

7  音乐 2014/7/10

表:专业

id  cid  title  content  time
1   1  Mark     xxxx      2010/8/31
2   4  BMW      xxxx      2012/2/12
3   1  Joe      xxxx      2015/1/31
4   7  sweet    xxxx      2013/8/22
5   1  KEN      xxxx      2010/1/31

结构应该是

PEOPLE
-Mark
-Joe
-KEN
CAR
-BMW
Music
-sweet

我希望Html输出可以这样(通过php+mysql)

<ul>
 <li class=""><a href="#">PEOPLE</a></li>
 <ul class="sub">
   <li><a title='Mark' href='?id=1'>Mark</a></li>
   <li><a title='Joe' href='?id=3'>Joe</a></li>
   <li><a title='KEN' href='?id=5'>KEN</a></li>
 </ul>
 <li class=""><a href="#">CAR</a></li>
 <ul class="sub">
   <li><a title='BMW' href='?id=2'>BMW</a></li>
 </ul>
 <li class=""><a href="#">Music</a></li>
 <ul class="sub">
   <li><a title='sweet' href='?id=4'>sweet</a></li>
 </ul>
</ul>

How do I to coding sql?


$rst = mysql_query("select ?????? ");
while($row = mysql_fetch_object($rst)){ 

echo <<<EOD
<ul>
 <li class=""><a href="#">{$row->pro_class.title}</a></li>
 <ul class="sub">
   <li><a title='{$row->pro.title}' href='?id={$row->pro.id}'>{$row->pro.title}</a></li>
 </ul>
</ul>


EOD;
}

【问题讨论】:

  • 那么你到目前为止都尝试了什么??
  • 是的!一开始我使用了两个mysql_query,一个是获取pro_class的数据,包含pro_class.cid,然后通过它查询下一张表,mysql_query("select * from pro where cid='pro_class.cid'");
  • 甚至不要考虑使用 mysql_* 接口。切换到 mysqli 或 PDO。 mysql_* 在最新的 PHP 版本中已被弃用并消失。

标签: php mysqli tree


【解决方案1】:

您可以尝试这种方法。它使用 group_concat。

<?php
$query = "select pc.title as title, group_concat(p.title) as inner_titles FROM pro_class pc  LEFT JOIN pro p ON p.cid=pc.cid GROUP BY p.cid ORDER BY p.title";
$result=mysqli_query($query);
print "<ul>";
while($res=mysqli_fetch_array($result)) {
    print "<li>" . $res['title'] . "</li>";
    $arr = explode(",",$res['inner_titles']);
    if(count($arr)>0) {
        print "<ul>";
        foreach($arr as $val) {
            print "<li>" . $val . "</li>";
        }
        print "</ul>";
    }
}
print "</ul>";
?>

【讨论】:

  • 谢谢,但是如果table:pro_class有数据,但是table:pro没有,那么就不能显示pro_class.title...
  • @ss123 你可以使用左连接来解决这个问题。即使 pro 表中没有匹配的行,它也会为 pro_class 表的每一行返回至少一行
  • @ss123 您无法通过我的回答和上述评论解决您的问题吗?
【解决方案2】:

您可以使用名为 group_concat 的 mysql 函数,它将许多行合并为一个由您选择的内容分隔的字符串。

以下内容将为您提供获得所需内容的大部分方法 - 不过您可能可以自己解决显示部分。

select
    pro_class.title,
    GROUP_CONCAT(pro.title SEPARATOR ',') AS listItems
from
    pro_class
        left outer join pro
            on pro_class.cid=pro.cid
group by
    pro_class.title

【讨论】:

  • 谢谢,但是如果table:pro_class有数据,但是table:pro没有,那么就不能显示pro_class.title
  • @ss123 我将联接更改为外部联接,这将解决您关于第二个表为空的问题。你也可以好好阅读我整理的这篇文章:stackoverflow.com/questions/12475850/…
猜你喜欢
  • 2019-01-11
  • 1970-01-01
  • 2013-09-06
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2013-02-07
  • 2014-07-15
相关资源
最近更新 更多