简体   繁体   English

显示包含两个表中数据的列表

[英]Displaying a list with data from two tables

i have 2 tables that I would like to pull data from. 我有2个表,我想从中提取数据。 The first table is called categories and structured like so: 第一个表称为类别,其结构如下:

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

I'm using the following code to display the data as a list: 我正在使用以下代码将数据显示为列表:

<?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();  
?>

So this obviously pulls the data like this: 因此,这显然会拉出如下数据:

Desktop Courses
  Adobe
    CS6
IT Courses
  Microsoft
    Server 2008

Now I also have a table that displays the courses that is structured like this: 现在,我还有一个表来显示结构如下的课程:

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

Now i'd like to merge the data from courses into the category list, but i'm not sure how to do it so that it would display like this: 现在,我想将课程中的数据合并到类别列表中,但是我不确定如何做到这一点,以便显示如下:

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

Any help would be much appreciated. 任何帮助将非常感激。

Well, what you can try to do is just UNION ALL data from both tables like this: 好吧,您可以尝试做的就是从两个表中获取UNION ALL数据,如下所示:

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

Additional column type is added to the result set that you can distinguish between the categories and courses later on. 其他列type将添加到结果集中,您可以稍后区分类别和课程。 That way you will leverage your existing php code. 这样,您将利用现有的php代码。 You'll need to do adjustments to accommodate this field though. 不过,您需要进行调整以适应此字段。

EDIT: The problem with this approach is that ids from both tables intersect. 编辑:这种方法的问题是来自两个表的ID相交。 To alleviate this problem you might: 要缓解此问题,您可以:

  • Shift courses' ids for a predifined value (let's say 1000). 将课程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
  • Define ids for categories and for courses from different ranges in the first place 首先为类别和不同范围的课程定义ID

To encourage you to consider switching from deprecated mysql_ to PDO here is how your data access code might look like: 为了鼓励您考虑从已弃用的mysql_切换到PDO这是您的数据访问代码的外观:

<?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

Disclaimer: Error handling, validation, etc skipped for brevity. 免责声明:为简洁起见,跳过了错误处理,验证等内容。

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')

希望这可以帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM