使用COALESCE和LEFT JOIN将SQL查询转换为PHP

问题描述

我有2张桌子:

用户

ID   usr_login  user_email        display_name
1    john       [email protected]    John Jones    
2    steve      [email protected]     Steve Jobs    
3    tom        [email protected]   Tom Thumb

userMeta

uMeta_id  user_id   Meta_key    Meta_value    
1         1         phone       8005551212    
2         1         email       [email protected]    
3         1         b_date      12/25    
20        2         phone       2025554567    
21        2         email       [email protected]    
22        2         b_date      11/01    
40        3         phone       9095559876    
41        3         email       [email protected]    
42        3         b_date      01/30

Nick可以帮助我整理一个SQL查询,以这种格式成功显示数据:

User1-displayName     User1-eMailAddress     User1-Phone     User1-Bdate
User2-displayName     User2-eMailAddress     User2-Phone     User2-Bdate
User3-displayName     User2-eMailAddress     User3-Phone     User3-Bdate

这是Nick的SQL查询

SELECT u.display_name,COALESCE(e.Meta_value,'') AS user_email,COALESCE(p.Meta_value,'') AS phone,COALESCE(b.Meta_value,'') AS bdate
FROM users u
LEFT JOIN userMeta e ON e.user_id = u.ID AND e.Meta_key = 'email'
LEFT JOIN userMeta p ON p.user_id = u.ID AND p.Meta_key = 'phone'
LEFT JOIN userMeta b ON b.user_id = u.ID AND b.Meta_key = 'b_date'
ORDER BY u.ID

由于并非所有用户都有b_date数据,因此我们必须使用合并。

我想用PHP文件生成相同的结果,以在网页上显示数据。

这是我尝试过的PHP代码代码返回“ 0结果”。

如果我注释掉COALESCE,FROM,LEFT JOIN和ORDER BY行,则会得到ID,名称和电子邮件地址的用户列表。

<?PHP
$servername = "localhost";
$username = "adminuser";
$password = "mypass";
$dbname = "website";

// Create connection
$conn = new MysqLi($servername,$username,$password,$dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection Failed: " . $conn->connect_error);
}

$sql = '';
$sql .= "SELECT ID,display_name,user_email from users";
$sql .= "COALESCE(e.Meta_value,'') AS user_email";
$sql .= "COALESCE(p.Meta_value,'') AS phone";
$sql .= "COALESCE(b.Meta_value,'') AS b_date";
$sql .= "FROM users u";
$sql .= "LEFT JOIN userMeta e ON e.user_id = u.ID AND e.Meta_key = 'user_email'";
$sql .= "LEFT JOIN userMeta p ON p.user_id = u.ID AND p.Meta_key = 'phone'";
$sql .= "LEFT JOIN userMeta b ON b.user_id = u.ID AND b.Meta_key = 'b_date'";
$sql .= "ORDER BY u.ID";
$sql = '';

$result = $conn->query($sql);
    echo "ID &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Email Address &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Phone &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Birthdate". "<br>";
    
if ($result->num_rows > 0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    echo $row["ID"]. "&nbsp;&nbsp;" . $row["display_name"]. "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $row["user_email"]. "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $row["phone"]. "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $row["b_date"] "<br>";
    
  }
} else {
  echo "0 results";
}
$conn->close();

?>

凯文,谢谢你

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)