我的目标是:显示特定的ID在一个表phpbb_topics
中作为topic_poster
重复的频率,但前提是也满足适当的forum_id条件,然后还显示另一个表phpbb_users
中对应的用户名。
我已经成功地提取了一个特定用户ID在phpbb_topics表中作为topic_poster出现的频率,如下所示:
SELECT topic_poster, COUNT(topic_poster)
FROM phpbb_topics WHERE forum_id = 156
GROUP BY topic_poster
感谢StackOverflow上的另一个问题,我现在也知道了如何从另一个表中获取数据,以获得与特定userID对应的用户名,如下所示:
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 BY
或ORDER 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
我得到了所有的结果,但是我不能按计数器排序。
1条答案
按热度按时间bpzcxfmw1#
mySQL extends the group by,因此您不必有一个。但是,它假定每列的所有值都相同;因此它可以自由地从每一列中选择要放入的内容。但是,如果值不同,它选择的内容(1个值)并不能代表整个集合,因此当值不同时,必须使用group by。
放异道:如果t.forum_ID = 156仅限于特定的topic_poster、user_Id和username,则不会出现问题。但由于t.forum_ID在这些列中的每一列中表示许多不同的值,因此需要使用group by,否则引擎将“在某种程度上”随机为它们中的每一列选择一个值。引擎假定所有这些值都是相同的。
但是,如果所有未聚合的列都具有相同的值...您可以通过允许引擎仅聚合并为每个列“挑选”一个值来获得性能增益。
根据你的回答,你认为你应该得到多行。所以这告诉我非聚合字段是不同的,所以添加一个分组依据...
你可以有领带,所以你可能也想在计数后按海报或用户名订购...