【问题标题】:grouping mysql results with joined table将 mysql 结果与连接表分组
【发布时间】:2017-10-25 12:34:46
【问题描述】:

我正在制作一个包含文章列表、另一个用户表和另一个用户喜欢的文章的简单表格:

文章表:

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>';

}

问题是,当文章被点赞时,帖子会显示两次,但两次都处于活动状态。我尝试了分组,但是当它分组时,它会按我想要的方式显示文章一次,但没有任何活动。

希望我解释正确,但我真的被困在这里。有什么想法吗?我可能接近这个错误..

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需结果。此外,您所写的查询也不起作用,因为 user_idWHERE 子句中不明确。

标签: php mysql sql while-loop


【解决方案1】:

如果你要使用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};

之后,您将在uLiked 参数中获得,10,30,15,(userid) 之类的数据。

现在您可以通过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>';

}

【讨论】:

  • 我的男人!!!这正是我想要做的......我只是在查询中做GROUP_CONCAT(likes.user_id)if (strpos($row['uLiked'], 30) !== false) {,但它正是我需要的,谢谢!
  • 你必须在开头和结尾加上 ,(comma) 否则在你的条件下 130 也会得到满足,这是错误的。
猜你喜欢
  • 2019-04-18
  • 2012-09-26
  • 1970-01-01
  • 2019-07-07
  • 2012-08-15
  • 2016-08-11
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多