MYSQL多表联合查询问题
比如我有两个表:表A是火车表,其中字段含义:ID:火车的ID,NAME,NU1:第一节车厢货物的ID,NU2:第二节车厢货物的ID,依次类推一直到NU30,未装载的车厢的...
比如我有两个表:
表A是火车表,其中字段含义:ID:火车的ID,NAME,NU1:第一节车厢货物的ID,NU2:第二节车厢货物的ID ,依次类推一直到NU30,未装载的车厢的货物ID为"-1"
比如 ID NAME NU1 NU2 ............
10 A车 1000 1001 ............
11 B车 1001 1000
表B是货物表,其中字段含义:ID:货物的ID,IT_NAME:货物的名称
比如: ID IT_NAME
1000 煤
1001 碳
我希望通过查询得到一张大表,显示每列火车上都有哪些货物以及ID,最后格式是:
10 A车 1000 煤 1001 碳 1002钢 ................
11 B车 1001碳 1000 煤 1003 铜 ................ 展开
表A是火车表,其中字段含义:ID:火车的ID,NAME,NU1:第一节车厢货物的ID,NU2:第二节车厢货物的ID ,依次类推一直到NU30,未装载的车厢的货物ID为"-1"
比如 ID NAME NU1 NU2 ............
10 A车 1000 1001 ............
11 B车 1001 1000
表B是货物表,其中字段含义:ID:货物的ID,IT_NAME:货物的名称
比如: ID IT_NAME
1000 煤
1001 碳
我希望通过查询得到一张大表,显示每列火车上都有哪些货物以及ID,最后格式是:
10 A车 1000 煤 1001 碳 1002钢 ................
11 B车 1001碳 1000 煤 1003 铜 ................ 展开
4个回答
展开全部
这种结构要一次查出来没有什么高效的方法,只能按一楼的方法去做,如果要提高效率,应该要分两步,第一步把结果集得到,然后遍历得到各节车厢的货物名称。
假设你使用adodb:
$rows=$db->getAll("select * from A ");
for($i=0;$i<count($rows);$i++)
{
for($j=1;$j<=30;$j++)
{
$index1="NU".$j;
$index2="item".$j."_name";
if($rows[$i][$index1]>-1)
{
$rows[$i][$index2]=$db->getOne("select item_name from B where ID=".$rows[$i][$index1]);
}
}
}
结果集得到后,可以根据要求显示的格式做具体处理。
假设你使用adodb:
$rows=$db->getAll("select * from A ");
for($i=0;$i<count($rows);$i++)
{
for($j=1;$j<=30;$j++)
{
$index1="NU".$j;
$index2="item".$j."_name";
if($rows[$i][$index1]>-1)
{
$rows[$i][$index2]=$db->getOne("select item_name from B where ID=".$rows[$i][$index1]);
}
}
}
结果集得到后,可以根据要求显示的格式做具体处理。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//先读出所有列车信息:
$query = mysql_query("SELECT * FROM A ");
$a_list = array(); //这里是 所有火车信息 数组
while($record = mysql_fetch_assoc($query)) {
$a_list[] = $record;
}
// 读取所有货物信息
$query = mysql_query("SELECT * FROM B ");
$b_list = array(); //这里是 所有货物信息 数组
while($record = mysql_fetch_assoc($query)) {
$hid = $record['id'];
$b_list[$hid] = $record['it_name']; //这里重要
}
// 循环 插入 对应的 货物名字 , 没有在读取数据库所以 速度快。
foreach($a_list as $k=>$v) {
for($i=1;$i<=30;$i++) {
if($v['NU'.$i] != -1){
$it_id = $v['NU'.$i]; //货物的编号
$a_list[$k]['NU_IT'.$i] = $b_list[$it_id]; //创建新的元素 插入货物名称。
}
}
}
//那么结果 $a_list 这个数组 就是你要的 结果了。
//这里 NU_IT1 , NU_IT2, ...... NU_IT30 这些 就是货物名字
// 这个 只是读了 2次 数据 所以 效率应该很高了。
$query = mysql_query("SELECT * FROM A ");
$a_list = array(); //这里是 所有火车信息 数组
while($record = mysql_fetch_assoc($query)) {
$a_list[] = $record;
}
// 读取所有货物信息
$query = mysql_query("SELECT * FROM B ");
$b_list = array(); //这里是 所有货物信息 数组
while($record = mysql_fetch_assoc($query)) {
$hid = $record['id'];
$b_list[$hid] = $record['it_name']; //这里重要
}
// 循环 插入 对应的 货物名字 , 没有在读取数据库所以 速度快。
foreach($a_list as $k=>$v) {
for($i=1;$i<=30;$i++) {
if($v['NU'.$i] != -1){
$it_id = $v['NU'.$i]; //货物的编号
$a_list[$k]['NU_IT'.$i] = $b_list[$it_id]; //创建新的元素 插入货物名称。
}
}
}
//那么结果 $a_list 这个数组 就是你要的 结果了。
//这里 NU_IT1 , NU_IT2, ...... NU_IT30 这些 就是货物名字
// 这个 只是读了 2次 数据 所以 效率应该很高了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-03-14
展开全部
我想到一个笨方法
SELECT A.ID, A.NAME, B11.ID, B11.IT_NAME, B12.ID, B12.IT_NAME FROM A, B B11, B B12
where A.NU1=B11.ID and A.NU2=B12.ID
这个sql你根据自己的实际需要,可以改写,不过效率可能很差
SELECT A.ID, A.NAME, B11.ID, B11.IT_NAME, B12.ID, B12.IT_NAME FROM A, B B11, B B12
where A.NU1=B11.ID and A.NU2=B12.ID
这个sql你根据自己的实际需要,可以改写,不过效率可能很差
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得你应该将表好好设计一下!你这样的话表就太死了!不便扩展!还有就是不管你怎么查询效率都不高!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询