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 が交差することです。この問題を軽減するには、次の方法があります。

  • あらかじめ定義された値 (1000 としましょう) のコースの ID をシフトします。
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 を定義します

非推奨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

免責事項:簡潔にするために、エラー処理、検証などはスキップされます。

于 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 に答える