循环遍历数组类别以获取子类别

时间:2011-02-20 08:06:53

标签: mysql arrays loops foreach while-loop

我有三张桌子,看起来像这样:

users_table                      categories_table         depart_table

u_id   cid  name  d_array      |  c_id   d_array       |  d_id  d_name  u_array
1      3   Jam     1,3,4       |  1      2,4           |  1    James    1,2,5
2      1   Ham     1,4,6       |  2      1,2,3         |  2    Mark     3,4
3      2   Ink     2,6,7       |  3      1,2,5         |  3    Love     1,5
4      4   Kal     4,2         |  4      4,5,6,7       |  4    Phone    1,2,4
5      3   Pol     1,5,3       |  5      7             |  5    Bags     5

基本上,cid(类别ID)来自帖子。所以$ c_id = $ _POST [“cid”]; 所以,我们知道cid是什么。

现在我们要显示该类别的所有部门。 然后...... 显示该部门内的用户列表。 因此,如果$c_id = 3结果应为:

   James
       Jam
       Pol

   Mark

   Bags
      Pol

说明: 因为c_id == 3,我们遍历d_array即部门数组 - 来获取用户数组。现在,每个具有cid OF 3的用户都应该只包含在列表中。 你可以看到James(cid 3数组中的第一个值)有Jam和Pol但不是HAM;因为HAM没有3的cid。

这是我的解决方案,但它不起作用。

     `$sql_myDetails = mysql_query("SELECT * FROM categories_table WHERE c_id = '$c_id'")`

or die ("<p>died 20: $sql_myDetails<br>" . mysql_error());          while($row = mysql_fetch_array($sql_myDetails)){      $c_id= $row["cid"];      $d_array = $row["d_array "];          }

     if ($d_array != ""){
    $sqlUsers = mysql_query("SELECT * FROM users_table WHERE c_id = '$c_id' AND d_array IN ($d_array)");
while($get_staff = mysql_fetch_array($sqlUsers )){
    $u_id = $get["u_id"];
    $name = $get["name"];
    }

$sqlDept = mysql_query("SELECT * FROM depart_table WHERE d_id IN ($d_array)")
or die ("<p>died 52: $sqlDept<br>" . mysql_error());
while($get = mysql_fetch_array($sqlDept)){
    $d_id = $get["d_id"];
    $d_name = $get["d_name"];
    $u_array = $get["u_array"];
    echo $d_name."<br />";
if ($u_array != ""){
$exloded_u_array = explode(",", $u_array); 
foreach($exloded_u_array as $key2 => $value2) { 
$sql_user = mysql_query("SELECT * FROM user_table WHERE u_id = '$value2'");
while($get_name = mysql_fetch_array($sql_user)){
    $user_id = $get["u_id"];
    $user_name = $get["name"];
    }
}
echo $user_name."<br />";
 }
}
}

我试过,它会显示类别,但会显示该部门内的所有用户。它应该只显示具有该类别的c_id的用户。

请你检查我做错了什么。

1 个答案:

答案 0 :(得分:3)

我不使用php,如果有任何数据库的东西,我没有做太多。看看你的代码,步骤似乎有点混乱,例如,除非我误解,你似乎为每个匹配的行多次分配一些变量,如$u_id,然后从不使用它们。在任何情况下,使用您当前的数据库结构,我建议您按照此伪代码重写代码:

  1. 查询所需类别的类别表
  2. 查询具有该类别ID的用户的用户表
  3. 查询类别的d_array
  4. 中部门的部门表

    从此处您不再访问数据库,您需要的一切都在内存中

    For each department in your result from 3
      print the d_name
      for each id in department's u_array
        if that u_id exists in the result from 2, print that user's name
    

    那就是说,我建议你重新考虑你的数据库结构。在列中保留列表或“数组”通常是不好的做法。通常你要么为每个值保留单独的行,即

    users_table
    
    uid   cid  name    dept
    1     3    Jam     1
    1     3    Jam     3
    1     3    Jam     4
    

    这里行的主键是整行。或者你可以保留关系表,即

    users_table       |  users_depts_relation
                      |
    uid   cid   name  |  uid   dept
    1     3     Jam   |  1     1
                      |  1     3
                      |  1     4
    

    你也不需要保持双向关系,例如为每个用户保留一个d_array,为每个部门保留一个u_array,因为一个足以弄清楚另一个,特别是如果你以犹太教的方式存储它们刚刚通过简单的连接查询进行了描述。事实上,如果你更好地存储东西,你将能够通过良好的数据库查询找出你需要的东西,并且你将节省使用应用程序逻辑来匹配你的数据的周期和记忆。

    祝你好运!