在显示来自多个 table 的值后,按 COUNT 对 table 进行排序

Sort the table by COUNT after displaying values from multiple tables

我的目标是:显示特定 ID 在 table、phpbb_topics 中作为 topic_poster 重复的频率,但前提是正确的 forum_id 条件也是遇到,然后也显示来自另一个 table、phpbb_users.

的相应用户名

我已经成功地提取了一个特定用户 ID 作为 topic_poster 在 table phpbb_topics 中出现的频率的计数,就像这样:

SELECT topic_poster, COUNT(topic_poster)
FROM phpbb_topics WHERE forum_id = 156
GROUP BY topic_poster

感谢 Whosebug 上的另一个问题,我现在也知道如何从另一个 table 获取数据以获取与特定用户 ID 对应的用户名,例如:

SELECT t.topic_poster, u.user_id, u.username
FROM phpbb_topics t
LEFT JOIN phpbb_users u ON u.user_id = t.topic_poster

我也终于把两者混合起来得到了我想要的:

SELECT t.topic_poster, COUNT(t.topic_poster), u.user_id, u.username
FROM phpbb_topics t
LEFT JOIN phpbb_users u ON u.user_id = t.topic_poster WHERE t.forum_id = 156
GROUP BY t.topic_poster

但是,我不知道如何根据计数器正确地按降序或升序排序。 phpmyAdmin 不会让我只点击列名来排序,我用 GROUP BYORDER BY 写的任何查询都报告错误。

更新: 放入后:

SELECT t.topic_poster, COUNT(t.topic_poster), u.user_id, u.username
FROM phpbb_topics t
LEFT JOIN phpbb_users u ON u.user_id = t.topic_poster WHERE t.forum_id = 156
ORDER BY COUNT(topic_poster)

结果只显示一行:

topic_poster |COUNT(t.topic_poster) | user_id | username
6 | 254 6 | Opix

如果我使用这个也会发生同样的情况:

SELECT t.topic_poster, COUNT(t.topic_poster), u.user_id, u.username
FROM phpbb_topics t
LEFT JOIN phpbb_users u ON u.user_id = t.topic_poster WHERE t.forum_id = 156
ORDER BY COUNT(t.topic_poster)

如果我使用这个也会发生同样的情况:

SELECT t.topic_poster, COUNT(t.topic_poster), u.user_id, u.username
FROM phpbb_topics t
LEFT JOIN phpbb_users u ON u.user_id = t.topic_poster WHERE t.forum_id = 156
ORDER BY topic_poster

如果我使用这个:SELECT t.topic_poster, COUNT(t.topic_poster), u.user_id, u.username FROM phpbb_topics t LEFT JOIN phpbb_users u ON u.user_id = t.topic_poster WHERE t.forum_id = 156 GROUP BY t.topic_poster我得到了所有结果,但我不能按计数器排序。

mySQL extends the group by 所以你不必拥有一个。但是,它假设每列的所有值都相同;因此可以自由地从每一列中选择要放入的内容。但是,如果值不同,它选择的(1 个值)并不代表整个集合,因此当值不同时,您必须使用 group by。

换一种说法:如果 t.forum_ID = 156 限于特定的 topic_poster、user_Id 和用户名。你不会有问题的。但是由于 t.forum_ID 在每一列中代表许多不同的值,因此需要分组依据,否则引擎将“有点”随机 select 每个值的值。引擎假定所有内容都相同。

因此 mySQL Group by extension 的垮台。但是,如果所有 non-aggregrated 列都具有相同的值...您可以通过允许引擎聚合并 'pick' 每列的值来获得性能提升。

根据您的回复,您认为您应该获得多行。所以这告诉我 non-aggregated 字段不同所以添加一个组...

SELECT t.topic_poster, COUNT(t.topic_poster), u.user_id, u.username
FROM phpbb_topics t
LEFT JOIN phpbb_users u ON u.user_id = t.topic_poster 
WHERE t.forum_id = 156
GROUP BY t.topic_poster, u.user_id, u.username
ORDER BY COUNT(t.topic_poster)

你可能有领带,所以你可能还想在计数后按海报或用户名订购...