I have 2 tables:
Users
ID usr_login user_email display_name
1 john john@gmail.com John Jones
2 steve steve@att.com Steve Jobs
3 tom tom@verizon.net Tom Thumb
usermeta
umeta_id user_id meta_key meta_value
1 1 phone 8005551212
2 1 email john@gmail.com
3 1 b_date 12/25
20 2 phone 2025554567
21 2 email steve@att.com
22 2 b_date 11/01
40 3 phone 9095559876
41 3 email tom@verizon.net
42 3 b_date 01/30
Nick was able to help me put together an SQL query that displays the data successfully in this format:
User1-DisplayName User1-eMailAddress User1-Phone User1-Bdate
User2-DisplayName User2-eMailAddress User2-Phone User2-Bdate
User3-DisplayName User2-eMailAddress User3-Phone User3-Bdate
Here is Nick's SQL query:
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
We had to use coalesce since not all users have b_date data.
I would like to generate the same results with a php file to display the data on a webpage.
Here is the PHP code that I have tried. As is the code returns "0 results".
If I comment out the COALESCE, FROM, LEFT JOIN, and ORDER BY lines I get a list of my users with ID, Name, and Email Address.
<?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 Name Email Address Phone Birthdate". "<br>";
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo $row["ID"]. " " . $row["display_name"]. " " . $row["user_email"]. " " . $row["phone"]. " " . $row["b_date"] "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
Thanks in advance, Kevin