使用连接表

时间:2017-05-25 00:58:19

标签: php mysql sql while-loop

我正在制作一个包含文章列表,另一个用户表以及用户喜欢的另一篇文章的简单表格:

文章表:

id, userId, title, article, date

用户表

id, name, email, last_login

喜欢桌子:

id, user_id, article_id, dateLiked

我当前的查询:

SELECT 
articles.id as aid, articles.userId, articles.title, articles.article, 
likes.user_id as uLiked, likes.article_id as articleLiked 
FROM articles 
LEFT JOIN likes ON articles.id = likes.article_id
WHERE userId= "10"

所以,我想获得所有用户的文章,然后在while循环中,我检查用户是否登录匹配中的那些行,并显示它是否处于活动状态。如果不是,它仍然显示为非活动。如果他们正在查看其他人的文章。他们应该看到所有文章,但是他们联系的文章应该是活跃的。

while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){

    if($row['uLiked'] == 30 && $currentArticleID = $row['articleLiked']){ $status = 'active'; } else { $status = 'inactive';  }

    echo '<div class="'.$status.'">'.$row['title'].'</div>';

}

问题是当文章被喜欢时,帖子显示两次,但它两次都是活动的。我尝试了分组,但是当它分组时,它会像我想要的那样显示文章,但没有任何东西是活跃的。

希望我正确地解释它,但我真的被困在这里。任何想法的家伙?我可能正在接近这个错误......

1 个答案:

答案 0 :(得分:0)

如果你打算使用group by,那么mysql将一行中的所有行分组,而mysql只会从分组行中选择第一行,而其他行将被忽略。

所以你改变了一些逻辑。

  

使用GROUP_CONCAT mysql方法。

SELECT 
articles.id as aid, articles.userId, articles.title, articles.article, 
CONCAT(',',GROUP_CONCAT(likes.user_id),',') as uLiked, likes.article_id as articleLiked 
FROM articles 
LEFT JOIN likes ON articles.id = likes.article_id
WHERE userId= "10" group by {which every you want};

之后,您将在,10,30,15,参数中获得useriduLiked)等数据。

现在,您可以通过strpos字符串方法检查已识别的登录用户。

while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){

    if(strpos($row['uLiked'], ',30,') !== false && $currentArticleID = $row['articleLiked']){ $status = 'active'; } else { $status = 'inactive';  }

    echo '<div class="'.$status.'">'.$row['title'].'</div>';

}