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

Mysql 循环遍历数组类别以获取子类别,mysql,arrays,loops,foreach,while-loop,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

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

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(categories ID)是从post中获取的。所以$c_id=$_POST[“cid”]; 所以,我们知道cid是什么

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

   James
       Jam
       Pol

   Mark

   Bags
      Pol
说明: 因为
c_id==3
,我们循环通过
d_数组
,这是部门数组-以获得用户数组。现在,只有
cid
为3的每个用户才应该包括在列表中。 正如您所看到的,James(cid3数组中的第一个值)有Jam和Pol,但没有HAM;因为火腿的cid不是3

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

     `$sql_myDetails = mysql_query("SELECT * FROM categories_table WHERE c_id = '$c_id'")`
或死(“死了20:$sql\u myDetails
”.mysql\u error())
while($row=mysql\u fetch\u数组($sql\u myDetails)){
$c_id=$row[“cid”];
$d_数组=$row[“d_数组”];
}

     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 />";
 }
}
}
if($d_数组!=“”){
$sqlUsers=mysql_查询(“从users_表中选择*,其中c_id='$c_id'和d_数组位于($d_数组)”);
而($get\u staff=mysql\u fetch\u数组($sqlUsers)){
$u_id=$get[“u_id”];
$name=$get[“name”];
}
$sqlDept=mysql\u查询(“从($d\u数组)中包含d\u id的depart\u表中选择*)
或者死亡(“死亡52:$sqlDept
”.mysql_error()); 而($get=mysql\u fetch\u数组($sqlDept)){ $d_id=$get[“d_id”]; $d_name=$get[“d_name”]; $u_数组=$get[“u_数组”]; 回显$d_名称。“
”; 如果($u_数组!=“”){ $exloded___数组=分解(“,”,$u_数组); foreach($key2=>$value2的exloded__数组){ $sql_user=mysql_查询(“从用户_表中选择*,其中u_id='$value2'); 而($get\u name=mysql\u fetch\u数组($sql\u user)){ $user_id=$get[“u_id”]; $user_name=$get[“name”]; } } echo$user_name.“
”; } } }
我尝试过,它显示类别,但显示该部门内的所有用户。它应该只显示具有该类别的c_id的用户


请你检查一下我做错了什么。

我不怎么使用php,我也没有用它做过很多数据库的事情。看看您的代码,这些步骤似乎有点混乱,例如,除非我有误解,否则您似乎为每个匹配行多次分配了一些变量,如
$u\id
,然后从不使用它们。在任何情况下,使用当前的数据库结构,我建议您按照以下伪代码重写代码:

  • 查询所需类别的类别表
  • 查询具有该类别id的用户的用户表
  • 查询类别的d_数组中的部门的部门表
  • 从这里你不再访问数据库,你需要的一切都在内存中

    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_数组,为每个部门保留一个u_数组,因为一个就足以找出另一个,特别是如果您像我刚才描述的那样,通过一个简单的连接查询以洁食方式存储它们。事实上,如果您能够更好地存储数据,您将能够通过良好的数据库查询来了解您需要什么,并且可以节省使用应用程序逻辑来匹配数据的周期和内存


    祝你好运

    我不怎么使用php,我也没有用它做过很多数据库方面的工作。看看您的代码,这些步骤似乎有点混乱,例如,除非我有误解,否则您似乎为每个匹配行多次分配了一些变量,如
    $u\id
    ,然后从不使用它们。在任何情况下,使用当前的数据库结构,我建议您按照以下伪代码重写代码:

  • 查询所需类别的类别表
  • 查询具有该类别id的用户的用户表
  • 查询类别的d_数组中的部门的部门表
  • 从这里你不再访问数据库,你需要的一切都在内存中

    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_数组,为每个部门保留一个u_数组,因为一个就足以找出另一个,特别是如果您像我刚才描述的那样,通过一个简单的连接查询以洁食方式存储它们。事实上,如果您能够更好地存储数据,您将能够通过良好的数据库查询来了解您需要什么,并且可以节省使用应用程序逻辑来匹配数据的周期和内存


    祝你好运

    请展开表定义,向我们展示哪些类型的字段是“\u数组”字段(varchar,enum…)请展开表定义,向我们展示哪些类型的字段是“\u数组”字段(varchar,enum…)您的建议将打印该部门中的所有用户,而不是该部门中属于给定类别的用户。你错过了一个重要的条件;我也错过了
    和cid='$\u POST['c\u id']'
    。谢谢你的帮助。:)我没有错过。请注意,在查询2中,您仅从数据库中提取与该活动匹配的用户。然后在循环中检查查询2的结果中是否存在u_id。由于查询2只包含与该活动匹配的用户,因此您将只打印出正确的用户。您可以更新上面的伪代码以反映这一点,以便我可以将其标记为接受答案。这个