function compare($data1=0,$data2=0){
//regle:1<2<3<5<4<6<7<8<10<9
$tmp = array(1,2,3,5,4,6,7,8,10,9);
$cdata1=$cdata2=0;
foreach($tmp as $key=>$value){
if($data1==$value){
$cdata1=$key;
}
if($data2==$value){
$cdata2=$key;
}
}
return ($cdata1>$cdata2)?$data1:$data2;
}
Archive for: 四月, 2010
自定义规则比较字符串大小
sql两表联查并批量更新其中一表
简要情况如下
tableA(id,price)
tableB(pid,sid,shuliang)
其中tableA.id=tableB.pid,tableA.id=tableB.sid
大致意思是,
一个A可能由几个A元素组成,元素A有价格,组合A需要通过计算(每个元素A的价格x数量)得到价格
下面是目前想到的用法,使用了一个临时表,应该还有更好的解法
$list=array();
$bundle_id=ARRAY();
$sql="SELECT pb.bundle_id, sum(p.products_price*pb.subproduct_qty) as cout, sum(p.products_price_fournisseur*pb.subproduct_qty) as coutf FROM products p,products_bundles pb WHERE p.products_id=pb.subproduct_id GROUP BY pb.bundle_id";
$query=tep_db_query($sql);
while($value=tep_db_fetch_array($query)){
$list[]=$value;
}
if($list){
//clean the table
tep_db_query("DELETE FROM products_calculer_ensemble");
$insert="INSERT INTO products_calculer_ensemble VALUES";
$link='';
foreach($list as $value){
$insert.=$link."($value[bundle_id],$value[cout],$value[coutf])";
$link=',';
}
tep_db_query($insert);
tep_db_query("UPDATE products_calculer_ensemble SET coutf=0 WHERE coutf>0 AND pid IN (SELECT pb.bundle_id FROM products p,products_bundles pb WHERE p.products_id=pb.subproduct_id AND p.products_price_fournisseur=0)");
tep_db_query("UPDATE products p,products_calculer_ensemble pce SET p.products_price=pce.cout, p.products_price_fournisseur=pce.coutf WHERE p.products_id=pce.pid");
}
sql语句联表查询
1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

