Php 在MySQL中为留言板获取正确的最大结果,但不是正确的计数值
这是我第一次来这里。我正在尝试使用Php 在MySQL中为留言板获取正确的最大结果,但不是正确的计数值,php,mysql,count,left-join,Php,Mysql,Count,Left Join,这是我第一次来这里。我正在尝试使用PHP和MySQL构建一个留言板(论坛)。我想在PHP中显示一个包含以下信息的表: 一列显示所有当前论坛 另一列显示每个线程和帖子的总数 论坛 显示最新创建的线程的最后一列 这是我的查询,它返回正确的最新线程,但不是正确的计数: SELECT forums.*, threads.thread_id, threads.thread_topic, threads.user_id, users.u
PHP
和MySQL
构建一个留言板(论坛)。我想在PHP
中显示一个包含以下信息的表:
SELECT
forums.*,
threads.thread_id,
threads.thread_topic,
threads.user_id,
users.user_name,
threads.thread_date,
COUNT(DISTINCT threads.thread_id) AS thread_count,
COUNT(DISTINCT posts.post_id) AS post_count
FROM forums
LEFT OUTER JOIN threads
ON forums.forum_id = threads.forum_id
AND threads.thread_date =
(SELECT MAX(threads.thread_date) AS last_topic
FROM threads
WHERE forums.forum_id = threads.forum_id)
LEFT JOIN users
ON users.user_id = threads.user_id
LEFT JOIN posts
ON threads.thread_id = posts.thread_id
GROUP BY forums.forum_id
这些是帖子和帖子计数的结果,它只计算每个论坛最新帖子中的帖子和帖子:
post count thread count
- -
7 1
1 1
1 1
1 1
0 0
SELECT
COUNT(DISTINCT posts.post_id) AS post_count,
COUNT(DISTINCT threads.thread_id) AS thread_count
FROM forums
LEFT OUTER JOIN threads
ON threads.forum_id = forums.forum_id
LEFT JOIN posts
ON threads.thread_id = posts.thread_id
GROUP BY forums.forum_id;
此查询获取每个论坛的正确帖子和线程数:
post count thread count
- -
7 1
1 1
1 1
1 1
0 0
SELECT
COUNT(DISTINCT posts.post_id) AS post_count,
COUNT(DISTINCT threads.thread_id) AS thread_count
FROM forums
LEFT OUTER JOIN threads
ON threads.forum_id = forums.forum_id
LEFT JOIN posts
ON threads.thread_id = posts.thread_id
GROUP BY forums.forum_id;
每个论坛的帖子和线程数结果应为:
post count thread count
- -
7 1
1 1
3 2
1 1
0 0
我是否可以组合这两个查询,或者修复第一个查询,从而获得正确的输出
请在您的建议中使用下表:
用户、线程、论坛、帖子
我是新来的PHP
和MySQL
,如果这样做不对,我很抱歉
非常感谢你的帮助 由于
和threads.threaddate=(选择MAX(threads.threaddate)…
条件,您只计算最新线程。您需要加入一个子查询,以获取每个论坛中最新线程的行。请参阅以了解如何编写子查询。是的,我理解。我只是不确定如何正确设置子查询的格式。谢谢你的链接。是的,看起来很有效。感谢您抽出时间写出解决方案!
SELECT
forums.*,
counts.thread_count,
counts.post_count,
threads.*, -- last thread
users.* -- user of last thread
FROM forums
LEFT JOIN (
SELECT
forums.forum_id,
COUNT(DISTINCT threads.thread_id) AS thread_count,
COUNT(DISTINCT posts.post_id) AS post_count
FROM forums
LEFT JOIN threads ON threads.forum_id = forums.forum_id
LEFT JOIN posts ON posts.thread_id = threads.thread_id
GROUP BY forums.forum_id
) counts ON counts.forum_id = forums.forum_id
LEFT JOIN (
SELECT
forums.forum_id,
threads.thread_id,
FROM forums
JOIN threads ON forums.forum_id = threads.forum_id
AND threads.thread_date =
(SELECT MAX(threads.thread_date) AS last_topic
FROM threads
WHERE forums.forum_id = threads.forum_id)
) last_thread ON last_thread.forum_id = forums.forum_id
LEFT JOIN threads ON threads.thread_id = last_thread.thread_id
LEFT JOIN users ON users.user_id = threads.user_id