2016-05-12 78 views
3

我想知道SQL查詢是否可以使用SQL中的某些條目返回數據。我很抱歉,如果它不是explicite(這裏不是英語,我想你理解了它),讓我們來看一個例子:我可以直接在SQL查詢中處理返回值嗎

$req = $bdd->prepare('SELECT u.u_id, u.u_name, um.um_id, um.um_name, um.um_value 
FROM users as u 
LEFT JOIN users_metas as um ON um.um_uid = u.u_id'); 
$prepare->execute(); 
$datas = $prepare->fetchAll(); 

所以在這裏,我要在$datas

數組
$datas = array(
0 => 
    u_id => 1 
    u_name => name 
    um_id => 1 
    um_name => meta_name1 
    um_value => meta_value1 
1 => 
    u_id => 1 
    u_name => name 
    um_id => 2 
    um_name => meta_name2 
    um_value => meta_value2 
... 
); 

我想什麼它是這樣的:

$datas = array(
0 => 
    u_id => 1 
    u_name => name 
    meta_name1 => meta_value1 
    meta_name2 => meta_value2 
1 => 
    u_id => an other user 
    ... 
); 

後我手動採取$datas照顧我已經有了這一點,但我想知道如果我能達到這個沒有處理的演示文稿,只有SQL?

我希望你們能理解我,如果你有一些問題,我會盡我所能去解釋。

問候。

回答

1

MySQL的溶液

通過被稱爲樞軸在表中從一列轉換的唯一值到多個列中的輸出轉化表值表達插入表中。與其他一些數據庫管理系統不同,MySQL沒有PIVOTCROSSTAB函數,所以你不能寫出一個適合所有問題的解決方案。

如果您事先知道um_name的所有可能值,則可以使用聚合函數來模擬此行爲。

SELECT u.u_id, u.u_name, 
MAX(CASE WHEN um_name = 'meta_name1' THEN um_value END) meta_name1, 
MAX(CASE WHEN um_name = 'meta_name2' THEN um_value END) meta_name2 
FROM users as u 
LEFT JOIN users_metas as um ON um.um_uid = u.u_id 
GROUP BY u.u_id, u.u_name; 

這種解決方案的缺點是,你必須不斷增加MAX(CASE WHEN um_name = '...' THEN um_value END)列的查詢的um_name每一個可能的值。

從理論上講,您可以通過首先選擇所有不同的um_name值在PHP中生成此查詢,但這不會使您的代碼更簡單或更快,因此沒有太多意義。

PHP解決方案

作爲替代,它是PHP的只有幾行到您的電流輸出轉換從fetchAll()成你想要的格式。

$out = []; 
array_walk($datas, function($v) use(&$out) { 
    $out[$v["u_id"]] = (isset($out[$v["u_id"]]) ? $out[$v["u_id"]] : []) 
     + ["u_id" => $v["u_id"], 
      "u_name" => $v["u_name"], 
      $v["um_name"] => $v["um_value"]]; 
}); 
$out = array_values($out); 

這不設置按鍵,如果記錄不中users_metas表中存在,所以你需要訪問一個特定的值,如果它不存在,所有用戶之前isset檢查。

+0

Thx很多這個答案,因爲我懷疑有沒有辦法做我想直接在SQL查詢^^! _(因爲我無法確定數字和metas的名字)_ 我已經在PHP中進行了處理,但thx對於這些行! – Vae

相關問題