我有两张桌子: publick_feed 和用户
我想从 public_feed 中选择所有内容,并从用户中选择三列, id 与 user_id <相同/ strong>在 public_feed 中 并将从 public_feed 返回的行分配给users表中的列(通讯员)
我试试这个:
<?php
$sql = "
SELECT * FROM public_feed
WHERE user_id IN
(SELECT id FROM users) AND
(SELECT Firstname,Lastname,Avatar FROM users WHERE id IN(SELECT user_id FROM public_feed))
";
$query = mysqli_query($dbc_conn,$sql);
if(mysqli_num_rows($query) > 0){
while($row = mysqli_fetch_assoc($query)){
//echo rows with correspondent details from the users table
echo $row['user_id'];
}
}
<?
请任何帮助将不胜感激。 谢谢。
答案 0 :(得分:2)
我认为进行连接比使用复杂的子查询更清晰:
SELECT u.Firstname,
u.Lastname,
u.Avatar,
COALESCE(pf.User_id, 'NA'),
COALESCE(pf.Post, 'NA'),
COALESCE(pf.Date, 'NA')
FROM users u
LEFT JOIN public_feed pf
ON u.Id = pf.User_id
我假设每个Feed都会在users表中有一个条目,但我不会反对LEFT JOIN
users
public_feed
。对于没有Feed条目的用户,NA
会显示在这些列中,并且该用户只会出现在一个记录中。
答案 1 :(得分:2)
如果public_feed中没有用户,并且您仍想要获取用户数据,则使用左连接的版本
SELECT
u.*, f.*
FROM
public_feed f LEFT JOIN
users u ON f.user_id = u.id;
因为作者要求解释,这里是:
首先,我们将使用表名别名来缩短查询次数
public_feed f
和
users u
我们说想要引用带别名的表。当然*
意味着我们要选择所有列
SELECT users.*, public_feed.*
等于
SELECT u.*, f.*
当然,你可以使用任何其他字母作为别名
接下来我们说public_feed.user_id必须等于users.id。但是当公共订阅源条目不存在时,只显示具有空值的列。这就是我们使用LEFT JOIN而不是INNER JOIN的原因。通常,JOINS用于从多个相关表中获取相关数据。
ON
关键字表示表中的列必须等于满足请求的值