JOIN sql语句问题

时间:2016-10-20 14:39:56

标签: php mysql sql

我正在尝试加入两个数据库表(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>";
            }

3 个答案:

答案 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