2009-11-03 3 views
2

Y at-il une requête où je peux faire les deux requêtes en une?Sélection et mise à jour dans une requête

C'est la première

$q = "select c.id as campaignId,c.priceFactor, 
       o.cid,o.bloggerPrice,o.state as state,o.customerPrice,o.id as orderId,o.listPrice,o.basicPrice 
       from campaign c, orders o 
       where c.id={$campaignId} 
       and c.id = o.cid 
       and o.state in (8,9)"; 

Et c'est le deuxième

foreach($orders as $order) 
     { 
      $listPrice  = $order->priceFactor * $order->basicPrice; 

      if($order->bloggerPrice < $listPrice || $order->customerPrice < $listPrice) 
      { 
       $order->bloggerPrice = $listPrice; 
       $order->customerPrice = $listPrice; 
      } 

      $qUpdate  = "update orders set 
           listPrice = {$listPrice},bloggerPrice={$order->bloggerPrice}, 
           customerPrice ={$order->customerPrice} 
           where id=$order->orderId and cid={$order->cid}"; 

      // $this->db->q($qUpdate); 
     } 

Ma question est: Puis-je le faire ci-dessus sans code PHP juste pur SQL?

+0

Quel serveur de base de données utilisez-vous? MySQL, SQL Server, Oracle? – Andomar

+0

Mysql est le serveur db – streetparade

Répondre

4

En MySQL, vous pouvez utiliser une jointure juste après UPDATE. Dans votre exemple, cela peut ressembler à ceci:

update Orders o 
inner join Campaign c on c.id = o.cid 
set 
    listPrice = o.priceFactor * order.basicPrice 
, bloggerPrice = case 
     when o.bloggerPrice < o.priceFactor * order.basicPrice 
      then o.priceFactor * order.basicPrice 
      else bloggerPrice 
     end 
, listPrice = case 
     when o.customerPrice < o.priceFactor * order.basicPrice 
      then o.priceFactor * order.basicPrice 
      else listPrice 
     end 
where o.state in (8,9) 
and c.id = {$campaignId} 
+0

Wow, vous devez être un sql gur merci cela a fonctionné pour moi :-) – streetparade

+0

Andomar - Cela peut-il être fait pour une seule table seulement? Ex: sélectionnez * dans le tableau; // Traiter quelque chose mettre à jour le jeu de tables blah = 1 –

+0

@Bart J: Oui, un UPDATE ne peut mettre à jour qu'une seule table à la fois. Si vous voulez vous assurer qu'une mise à jour qui couvre plusieurs tables réussit ou échoue dans son ensemble: c'est ce que les transactions sont faites pour. – Andomar

Questions connexes