【问题标题】:How can I order the results of an SQL query by the count of another table based on a shard ID?如何根据分片 ID 根据另一个表的计数对 SQL 查询的结果进行排序?
【发布时间】:2017-04-26 06:13:49
【问题描述】:

我有一个从数据库中获取帖子的 SQL 查询。一切正常,但现在我需要按每个帖子的 cmets 数量对结果进行排序。 cmets 位于一个单独的表上,并且它们有一个 post_id 列将其链接到该帖子。我需要根据分片 ID 通过 cmets 表的计数来排序帖子吗?我已经尝试了一切,但每次我尝试向查询中添加一些内容时,它都会完全停止运行并将我的页面留空。我需要帮助才能知道将其他 JOIN 语句放在哪里。这是我的查询:

    $union = "UNION ALL
                ( 
                    SELECT DISTINCT wallposts.p_id,wallposts.is_profile_notes,wallposts.times_viewed,wallposts.columnTimesShared,
                    wallposts.marked,wallposts.secure_id,wallposts.reshared,wallposts.group_id,
                    wallposts.totaluploads,wallposts.WallUploadID,wallposts.type,
                    wallposts.value,wallposts.media,wallposts.youtube,wallposts.post_type,
                    wallposts.privacy,wallposts.tagedpersons,wallposts.with_friends_tagged,wallposts.emotion_head,wallposts.selected_emotion,wallposts.title,
                    wallposts.url,wallposts.description,wallposts.cur_image,
                    wallposts.uip,wallposts.likes,wallposts.userid,
                    wallposts.posted_by,wallposts.post as postdata,wallusers.*, 
                    UNIX_TIMESTAMP() - wallposts.date_created AS TimeSpent,

                    PosterTable.mem_pic as posterPic, PosterTable.gender as posterGender,PosterTable.oauth_uid as poster_oauth_uid, PosterTable.username as posterUsername, 
                    PosterTable.mem_fname as posterFname,PosterTable.work as posterWork, 
                    PosterTable.mem_lname as posterLname,walllikes_track.id as PostLikeFound,wallposts.date_created 

                    FROM 
                        wallusers,wallusers as PosterTable, wallposts 
                    LEFT JOIN walllikes_track
                        ON wallposts.p_id = walllikes_track.post_id AND walllikes_track.member_id = ".$user_id." 
                    WHERE
                        wallusers.active = 1 
                    AND
                        PosterTable.active = 1
                    AND
                        wallposts.group_id IN (".$groups.")
                    AND
                        wallposts.group_id != 0
                    AND
                        PosterTable.mem_id = wallposts.posted_by
                    AND
                        wallposts.marked < ".$this->flagNumber."
                    AND
                        wallusers.mem_id = wallposts.posted_by ) ";

cmets 表称为 wallcmets,它有一个名为 post_id 的列。我知道我需要使用 JOIN 和 COUNT,但我不知道在我当前的代码中将它放在哪里。

【问题讨论】:

  • 在子查询中添加一个额外的连接,用于查找每个帖子的评论数并使用它。我无法给出确切的答案,因为遗漏了太多细节,而且您的查询一团糟。
  • 我应该在哪里插入 JOIN?这就是我的困境。每当我对查询进行任何更改时。它完全停止运行。
  • 是的,因为您的查询内容广泛且难以理解,正如问题所在。下一次,通过展示您的问题的最小示例来提出更好的问题。没有人可以重现您现在的查询,因为甚至没有任何数据可供使用。

标签: php mysql


【解决方案1】:

试试这个查询,我没有运行,但我更新了它。

SELECT wallposts.p_id,wallposts.is_profile_notes,wallposts.times_viewed,wallposts.columnTimesShared,
                wallposts.marked,wallposts.secure_id,wallposts.reshared,wallposts.group_id,
                wallposts.totaluploads,wallposts.WallUploadID,wallposts.type,
                wallposts.value,wallposts.media,wallposts.youtube,wallposts.post_type,
                wallposts.privacy,wallposts.tagedpersons,wallposts.with_friends_tagged,wallposts.emotion_head,wallposts.selected_emotion,wallposts.title,
                wallposts.url,wallposts.description,wallposts.cur_image,
                wallposts.uip,wallposts.likes,wallposts.userid,
                wallposts.posted_by,wallposts.post as postdata,wallusers.*, 
                UNIX_TIMESTAMP() - wallposts.date_created AS TimeSpent,

                PosterTable.mem_pic as posterPic, PosterTable.gender as posterGender,PosterTable.oauth_uid as poster_oauth_uid, PosterTable.username as posterUsername, 
                PosterTable.mem_fname as posterFname,PosterTable.work as posterWork, 
                PosterTable.mem_lname as posterLname,walllikes_track.id as PostLikeFound,wallposts.date_created 

                FROM 
                    wallusers,wallusers as PosterTable, wallposts 
               WHERE
                    wallusers.active = 1 
                AND
                    PosterTable.active = 1
                AND
                    wallposts.group_id IN (".$groups.")
                AND
                    wallposts.group_id != 0
                AND
                    PosterTable.mem_id = wallposts.posted_by
                AND
                    wallposts.marked < ".$this->flagNumber."
                AND
                    wallusers.mem_id = wallposts.posted_by ) " AND wallposts.p_id = walllikes_track.post_id AND walllikes_track.member_id = ".$user_id.";

【讨论】:

  • 感谢您的回答,但是您更新了哪一部分?我没有看到任何变化。我没有看到任何有关 cmets 表的内容。 cmets 表称为 wallcmets,它有一个名为 post_id 的列。
  • 我删除了 UNION ALL JOIN 和 ON 关键字,因为 SQL 允许您在不使用 JOIN 的情况下连接表。例如,SELECT e.id, e.did, e.name, e.sal, d.department, FROM employee e, department d WHERE e.did=d.id:
【解决方案2】:

更具可读性的查询可能如下所示...

至少我们还有机会。

SELECT DISTINCT p.p_id
              , p.is_profile_notes
              , p.times_viewed
              , p.columnTimesShared
              , p.marked
              , p.secure_id
              , p.media...
           FROM wallposts p...

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2017-11-14
    相关资源
    最近更新 更多