我正在制作一个包含文章列表,另一个用户表以及用户喜欢的另一篇文章的简单表格:
文章表:
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>';
}
问题是当文章被喜欢时,帖子显示两次,但它两次都是活动的。我尝试了分组,但是当它分组时,它会像我想要的那样显示文章,但没有任何东西是活跃的。
希望我正确地解释它,但我真的被困在这里。任何想法的家伙?我可能正在接近这个错误......
答案 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,
参数中获得userid
(uLiked
)等数据。
现在,您可以通过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>';
}