我正在尝试加入两个数据库表(home_comments和profile_img)。我想要尝试的是将home_comments数据库中的user_id与profile_img数据库进行匹配,以便从评论的人那里获取个人资料图像。我写的查询没有被破坏,因为它产生了结果,但查询结果显示了每个user_id在profile_img数据库中的所有图像。
每当一个人上传profile_img时,我只需将其添加到数据库中,然后只需调用其中的最后一个即可显示profile_img。所以,我正在寻找同样的概念来实现。用户要显示的最后一个profile_img。
每当我在查询结尾添加LIMIT 1
时,它只允许显示一条评论。我需要的是最后一个(DESC
)profile_img为每个用户显示,但仍显示所有注释。我怎么能做到这一点?
最初我有以下查询:
$select_comments_sql = "
SELECT *
FROM home_comments
ORDER BY id DESC
";
我对查询的尝试
$select_comments_sql = "
SELECT c. *,
p.user_id, p.img
FROM home_comments AS c
INNER JOIN profile_img AS p
WHERE c.user_id = p.user_id
ORDER BY id DESC
";
数据库设置:
home_comments
id, user_id, username, comment, date
profile_img结构:
id, user_id, img
编辑: 我还注意到它为数据库中的每张不同照片显示相同的注释,因此重复的注释。不确定这是否与图像问题有关。
带查询的SQL:
$select_comments_sql = "
SELECT c.*, p.user_id, p.img
FROM home_comments AS c
INNER JOIN (SELECT max(ID) as ID, user_ID
FROM profile_img
GROUP BY user_ID) PI
on PI.User_ID = C.USer_ID
INNER JOIN profile_Img p
on PI.user_ID = P.User_ID
and PI.ID = P.ID
ORDER BY C.id DESC
";
if ($select_comments_stmt = $con->prepare($select_comments_sql)) {
//$select_comments_stmt->bind_param("s", $user_id);
$select_comments_stmt->execute();
if (!$select_comments_stmt->errno) {
//echo "error";
}
$select_comments_stmt->bind_result($comment_id, $comment_user_id, $comment_username, $home_comments, $comment_date, /*$commenter_id,*/ $commenter_user_id, $commenter_img);
$comment_array = array();
while ($select_comments_stmt->fetch()) {
$comment_array[] = $comment_user_id;
$comment_array[] = $comment_username;
$comment_array[] = $home_comments;
$comment_array[] = $comment_date;
/*$comment_array[] = $commenter_id;*/
$comment_array[] = $commenter_user_id;
$comment_array[] = $commenter_img;
$commenter_img = '<img class="home-profile-pic" src=" '.$commenter_img.'">';
if ($home_comments === NULL) {
echo 'No comments found.';
} else {
echo $commenter_img;
echo $comment_username. "<br>";
echo $home_comments. "<br><br><br>";
}
答案 0 :(得分:2)
一种方法是使用内嵌视图生成一组数据,其中包含每个用户照片的最大ID,然后使用此设置限制所有用户的照片..
在下面,我生成一个名为PI的数据集,其中包含每个用户的每个配置文件图像的最大ID。然后将它连接回profile_img整个集合作为限制;因此只返回用户的最新照片。 这实质上可以确保您在注释和Photo_image之间建立1-M关系。多对多是导致问题的原因。
SELECT c.*, p.user_id, p.img
FROM home_comments AS c
INNER JOIN (SELECT max(ID) as ID, user_ID
FROM profile_img
GROUP BY user_ID) PI
on PI.User_ID = C.USer_ID
INNER JOIN profile_Img p
on PI.user_ID = P.User_ID
and PI.ID = P.ID
ORDER BY C.id DESC
答案 1 :(得分:1)
如果您只为一个(或几个)用户运行查询,最快的方法可能是在select
中进行子选择,而不是使用join
,因为你并没有严格地加入&#39;数据。
SELECT c. *,
(
SELECT p.img
FROM profile_img AS p
WHERE p.user_id = c.user_id
ORDER BY p.id DESC
LIMIT 1
) AS img
FROM home_comments AS c
WHERE c.user_id = x
当您只获取一个(或几个)时,这将避免计算每个用户的最新个人资料图片,因为嵌套查询无法加入索引
答案 2 :(得分:0)
我认为这应该可行,但我还没有测试过。
SELECT c.*, p.user_id, p.img, MAX(p.id) /* not sure if you need MAX(p.id) but try it with/without it here */
FROM home_comments c
LEFT OUTER JOIN profile_img p on p.user_id = c.user_id
WHERE p.id = MAX(p.id)
ORDER BY c.id DESC