2015-09-20 65 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)"; 
...