MySQL插入子查询选择

时间:2012-05-31 10:14:11

标签: php mysql insert subquery

基本上,我想插入到表中,从同一个表中获取值id,类似这样的

$sql = ("INSERT INTO commande (idfichecmd,idproduit,idclt,qte,datecmd)
(SELECT MAX(idfichecmd)+1 ,'1' AS idproduit ,'$idC' AS idclt ,'$fb' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'2' AS idproduit ,'$idC' AS idclt ,'$g' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'3' AS idproduit ,'$idC' AS idclt ,'$pi' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'4' AS idproduit ,'$idC' AS idclt ,'$ft' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'5' AS idproduit ,'$idC' AS idclt ,'$sd' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'6' AS idproduit ,'$idC' AS idclt ,'$ad' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'7' AS idproduit ,'$idC' AS idclt ,'$vs' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'8' AS idproduit ,'$idC' AS idclt ,'$wi' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'9' AS idproduit ,'$idC' AS idclt ,'$equip' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'10' AS idproduit ,'$idC' AS idclt ,'$fo' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'11' AS idproduit ,'$idC' AS idclt ,'$fh' AS qte,'$date' FROM commande)")or die(mysql_error());
$result = mysql_query($sql) or die("Unable to add commande : ". mysql_error());   
mysql_close();

但是,这个不起作用,有人知道为什么吗?

1 个答案:

答案 0 :(得分:0)

可以使用UNION

INSERT INTO commande (idfichecmd, idproduit, idclt, qte, datecmd)
  SELECT MAX(idfichecmd)+1,  1, '$idC', '$fb'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  2, '$idC', '$g'    , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  3, '$idC', '$pi'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  4, '$idC', '$ft'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  5, '$idC', '$sd'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  6, '$idC', '$ad'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  7, '$idC', '$vs'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  8, '$idC', '$wi'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  9, '$idC', '$equip', '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  , 10, '$idC', '$fo'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  , 11, '$idC', '$fh'   , '$date' FROM commande

但是首先在PHP中获取MAX(idfichecmd)可能更容易,然后使用INSERT ... VALUES(记住在事务中执行操作以保持原子性):

INSERT INTO commande (idfichecmd, idproduit, idclut, qte, datecmd) VALUES
  ($id+1, 1, '$idC', '$fb', '$date'),
  ($id  , 2, '$idC', '$g' , '$date'),
  -- etc.

或者,如果您只是想为每个新记录增加idfichecmd,请考虑创建列AUTO_INCREMENT(由此MySQL会自动为您完成所有这些操作):

ALTER TABLE commande MODIFY idfichecmd INT AUTO_INCREMENT;
INSERT INTO commande (idproduit, idclut, qte, datecmd) VALUES
  (1, '$idC', '$fb', '$date'),
  (2, '$idC', '$g' , '$date'),
  -- etc.