来自Group_Concat的SQL单独表键

时间:2014-07-04 05:19:09

标签: php mysql sql database join

我试图将IDPosts列分隔为每个ID的单行(尝试创建收藏的帖子列表)。它旁边的列列出了所有正确的列,但是已经分组,我想为在favuserposts列中组合在一起的每个列获取一行。请参阅下面的图片和查询。如果您需要更多信息,请与我们联系。

enter image description here

显示所有内容,但无法显示多个收藏的帖子ID:

SELECT Users.IDUser, 
       Users.username, 
       Users.profile_picture, 
       Favorites.IDPosts,
       GROUP_CONCAT(DISTINCT coalesce(Favorites.IDPosts,'')) as "favuserposts", 
       ( Select body 
         from Posts 
         where Favorites.IDPosts=Posts.IDPosts 
          AND Users.IDUser=Favorites.IDUser)    
FROM Users
    LEFT OUTER JOIN Favorites ON Favorites.IDUser = Users.IDUser
GROUP BY Users.IDUser HAVING COUNT(IDPosts)>0;

1 个答案:

答案 0 :(得分:1)

您按IDUser分组。因此,您选择的所有其他字段都是以某种方式聚合的。您可以指定所需的聚合(MIN,MAX,GROUP_CONCAT等),也可以获得随机匹配。那么让我们来看看你选择了什么:

  • Users.username =用户ID的“随机”用户名,但由于每个用户ID只有一个名称,因此您获得了id的一个用户名
  • Users.profile_picture =与用户名相同;你得到了一张用户的照片
  • Favorites.IDPosts =用户帖子ID中随机的一个
  • GROUP_CONCAT(DISTINCT coalesce(Favorites.IDPosts,'')) =所有不同ID的字符串
  • ( Select body from Posts ...) =用户帖子正文中随机的一个

因此,如果您想要一个列出所有实体的字符串,那么就像使用帖子ID一样使用group_concat:

GROUP_CONCAT(DISTINCT
( Select body 
  from Posts 
  where Favorites.IDPosts=Posts.IDPosts 
  AND Users.IDUser=Favorites.IDUser
)) as bodies