0

我有 2 个要从中提取数据的表。第一个表称为类别,其结构如下:

---------------------------------
id  |   name            |  parent |
--------------------------------- |
1   |  Desktop Courses  |     0   |
2   |  Adobe            |     1   |
3   |  CS6              |     2   |
4   |  IT Courses       |     0   | 
5   |  Microsoft        |     4   |
6   |  Server 2008      |     5   |

我正在使用以下代码将数据显示为列表:

<?php
  //Connect to mysql server
  $cn = mysql_pconnect("server", "username", "password");
  mysql_select_db("database");
  $rs = mysql_query("SELECT id, parent, name FROM course_categories", $cn);
  $childrenTree = array(); 
  $categoryNames = array(); 

  while($row = mysql_fetch_array($rs)){
     list($id, $parent, $name) = $row;     
     $categoryNames[(string)$id] = $name;
     $parent = (string)$parent;
     if(!array_key_exists($parent, $childrenTree)) 
         $childrenTree[$parent] = array();
     $childrenTree[$parent][] = (string)$id;
  }


 function renderTree($parentid = "0"){
    global $categoryNames;
    global $childrenTree;
    if($parentid != "0") echo "<li> ", $categoryNames[$parentid], "\n";
    $children = $childrenTree[$parentid];
    if(count($children) > 0){ //If node has children
       echo "<ul>\n";
       foreach($children as $child)
          renderTree($child);
       echo "</ul>\n";
    }
    if($parentid != "0") echo "</li>\n";
 }
 renderTree();  
?>

所以这显然会像这样提取数据:

Desktop Courses
  Adobe
    CS6
IT Courses
  Microsoft
    Server 2008

现在我还有一个表格,显示结构如下的课程:

---------------------------------------------------
id    |      categoryid   |      course            |
---------------------------------------------------|
1     |          3        |       Photoshop CS6    |
2     |          6        |       Active Directory |

现在我想将课程中的数据合并到类别列表中,但我不确定如何做到这一点,以便它显示如下:

Desktop Courses
  Adobe
    CS6
      Photoshop CS6
IT Courses
  Microsoft
    Server 2008
      Active Directory

任何帮助将非常感激。

4

2 回答 2

0

好吧,您可以尝试做的只是UNION ALL两个表中的数据,如下所示:

SELECT id, parent, name, 'category' as `type` FROM course_categories
 UNION ALL
SELECT id, categoryid, course, 'course' as `type` FROM courses

附加列type被添加到结果集中,您可以稍后区分类别和课程。这样,您将利用现有的 php 代码。不过,您需要进行调整以适应此字段。

编辑:这种方法的问题是两个表中的 id 相交。为了缓解这个问题,您可以:

  • 将课程的 ID 转换为预定义值(例如 1000)。
SELECT id, parent, name, 'category' as `type` FROM course_categories
 UNION ALL
SELECT (1000 + id) AS id, categoryid, course, 'course' as `type` FROM courses
  • 首先为不同范围的类别和课程定义 ID

为了鼓励您考虑从 deprecated 切换mysql_PDOhere,您的数据访问代码可能如下所示:

<?php

$childrenTree = array(); 
$categoryNames = array();

//Connect to mysql server
$db = new PDO('mysql:host=server;dbname=db;charset=UTF-8', 'user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$sql = "SELECT id, parent, name, 'category' as `type` FROM course_categories
         UNION ALL
        SELECT (1000 + id) AS id, categoryid, course, 'course' as `type` FROM courses";
foreach ($db->query($sql) as $row) {
     //your initial logic wrapped in the PDO row retrieval foreach loop
     list($id, $parent, $name) = $row;     
     $categoryNames[(string)$id] = $name;
     $parent = (string)$parent;
     if(!array_key_exists($parent, $childrenTree)) 
         $childrenTree[$parent] = array();
     $childrenTree[$parent][] = (string)$id;        
}
//close connection to the db
$db = null;

//Rest of your code goes here intact

免责声明:为简洁起见,跳过了错误处理、验证等。

于 2013-01-30T04:00:27.240 回答
0

select u_id, course_name, cat_id from (select id as 'u_id', name as 'course_name', parent as 'cat_id' from course_categories union select id as 'u_id', course as 'course_name', categoryid as 'cat_id')

希望这可以帮助

于 2013-01-30T04:01:31.517 回答