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只包含与该活动匹配的用户,因此您将只打印出正确的用户。您可以更新上面的伪代码以反映这一点,以便我可以将其标记为接受答案。这个