2016-05-12 76 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

相关问题