Php 我可以在SQL查询中直接返回值吗

Php 我可以在SQL查询中直接返回值吗,php,mysql,sql,fetchall,Php,Mysql,Sql,Fetchall,我想知道SQL查询是否可以使用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(); $da

我想知道SQL查询是否可以使用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就完成这个演示

我希望你们能理解我,如果你们有什么问题,我会尽我所能解释清楚


问候

MySQL解决方案

通过将表中的一列中的唯一值转换为输出中的多列,将表值表达式转换为表称为透视。与其他一些DBMS不同,MySQL没有
PIVOT
CROSSTAB
函数,因此您无法为这个问题编写一刀切的解决方案

如果您事先知道
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(当um_name='…'时为CASE,然后是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\u metas
表中,则不会设置键,因此,如果某个特定值不存在于所有用户,则在访问该值之前,您需要使用
isset
进行检查。

Thx对于这个答案来说太多了,因为我怀疑无法直接在SQL查询中执行我想要的操作^^!(因为我不能确定metas的编号和名称)我已经用PHP进行了处理,但是这些行的thx!