2015-09-20 66 views
3

从字面上看不出一个更好的方式来描述这个。从mysql查询中交换信息

所以,我需要更新数据库中的两列,并让它们交换一些信息。我觉得这可以简单地完成,我一直在想它 - 主要是因为现在整个事情都是通过PHP类中的3个不同的函数完成的(见下文)。

function hotSinglesInYourArea() 
    { 
     $sql = "SELECT 
        citizens.cid as id, 
        citizens.gender as gender 
       FROM 
        citizens 
       WHERE 
        citizens.status <> 'married'"; 
     $que = $this->db->prepare($sql); 
     $data = []; 
     try { 
      $que->execute(); 
      while($row = $que->fetch(PDO::FETCH_ASSOC)) 
      { 
       $data[] = $row; 
      } 
      }catch(PDOException $e){} 
     return $data; 
    } 
    function hookemup() 
    { 
     $data = $this->hotSinglesInYourArea(); 
     $count = (count($data))-1; 
     if($count >= 0) 
     { 
     mt_srand(time()); 
     $rand = mt_rand(0,$count); 
     $citizenA = $data[$rand]; 
     sleep(1); 
     mt_srand(time()); 
     $rand = mt_rand(0, $count); 
     $citizenB = $data[$rand]; 
     if($citizenA['gender'] <> $citizenB['gender']) 
     { 
      $this->getMarried($citizenA['id'],$citizenB['id']); 
     } 
     else 
     { 
      #echo $citizenA['id'].'|'.$citizenB['id']; 
      sleep(2); 
     } 
     } 
    } 
    function getMarried($a, $b) 
    { 
     $sql = "UPDATE 
        citizens 
       SET 
        partner = :a, 
        status = 'married' 
       WHERE 
        cid = :b; 
       UPDATE 
        citizens 
       SET 
        partner = :b2, 
        status = 'married' 
       WHERE 
        cid = :a2"; 
    $que = $this->db->prepare($sql); 
    $que->bindParam(':a', $a); 
    $que->bindParam(':a2', $a); 
    $que->bindParam(':b', $b); 
    $que->bindParam(':b2', $b); 
    try { $que->execute(); $que->nextRowset(); } catch(PDOException $e){} 
    } 

所以这些功能(我appoligize他们的名字,我只是用的东西我还记得)都有助于一个目的 - 他们发现“公民”是不是结婚了,然后他们结婚。 hotSinglesInYourArea找到单身的人,Hookemup随机选择一个,然后得到结婚实际上改变了DB。

正如我已经说过我不知道是否有一种方法,我在寻找,这将使在一个单一的功能这项工作(或至少更少的功能)

+0

问题是什么?看起来你已经有了更新 –

回答

0

你只是想简化UPDATE语句?如果是这样,你可以使用CASE syntax。您的SQL可以变为:

function getMarried($a, $b) 
{ 
    $sql = "UPDATE 
       citizens 
      SET 
       partner = CASE cid WHEN :b THEN :a ELSE :b END, 
       status = 'married' 
      WHERE 
       cid in (:b, :a)"; 
...