我需要一种方式让页面管理员按照用户在该特定页面上发布的帖子总数来查看其页面成员。帖子存储在不同的表中,例如民意调查,下载,维基等(如15个表)。每个都具有id,user_id,page_id,title,content等结构。列出页面所有用户的表称为“收藏夹”。它的结构只是id,user_id,page_id,date。
我目前有一个查询将所有“内容表”联合起来,以便特定用户在网站上显示他们所关注的页面,我可以轻松地使用WHERE对每个页面进行特定的查询page_id = $ page_id)。我尝试使用该代码来执行我在主持人区域尝试做的事情。正如我所提到的,在主持人区域,我需要按照他们的总帖子数DESC对用户列表进行排序。
我有这段代码,但它无效。
$getfans = mysql_query("SELECT DISTINCT user_id, ((SELECT id FROM wiki WHERE wiki.page_id = $page_id AND wiki.user_id = favorites.user_id)
UNION ALL
(SELECT id FROM downloads WHERE downloads.page_id = $page_id AND downloads.user_id = favorites.user_id)
UNION ALL
(SELECT id FROM polls WHERE polls.page_id = $page_id AND polls.user_id = favorites.user_id)) AS posts
FROM favorites WHERE favorites.page_id = $page_id AND favorites.status = 0 ORDER BY posts DESC", $conn);
我尝试了其他方法也没有用,但这个方法对我来说是最合乎逻辑的,所以它是我唯一要展示的方法
请帮忙。感谢。
此外...
这可能是朝着正确方向迈出的一步
$ getfans = mysql_query(“SELECT DISTINCT user_id,(SELECT COUNT(id) FROM polls WHERE page_id = $ page_id AND user_id = favorites.user_id) AS帖子来自收藏夹WHERE favorites.page_id = $ page_id AND favorites.status = 0 ORDER BY posts DESC“,$ conn);
当我回复$ posts时,它为我提供了该页面用户民意调查的正确计数。
然而,当我尝试做多个表时,它只返回一个用户。
示例:
$ getfans = mysql_query(“SELECT DISTINCT user_id,SUM((SELECT COUNT(id) FROM polls WHERE page_id = $ page_id AND user_id = favorites.user_id)+(SELECT COUNT(id)FROM wiki WHERE page_id = $ page_id AND user_id = favorites.user_id))AS发布收藏夹 WHERE favorites.page_id = $ page_id AND favorites.status = 0 ORDER BY 发表DESC“,$ conn);
我找到了解决方案
如果好奇,请阅读下面的帖子。
答案 0 :(得分:1)
使用左连接!
SELECT
f.user_id,
COUNT(w.user_id) + COUNT(d.user_id) + COUNT(p.user_id) as PageCount
FROM
favorites f
left join wiki w on
f.page_id = w.page_id
and f.user_id = w.user_id
left join downloads d on
f.page_id = d.page_id
and f.user_id = d.user_id
left join polls p on
f.page_id = p.page_id
and f.user_id = p.user_id
WHERE
f.page_id = $page_id
AND f.status = 0
GROUP BY
f.user_id
ORDER BY PageCount DESC
如果你想坚持工会方法:
select
f.user_id,
count(x.user_id) as PageCount
from
favorites f
inner join (
select user_id, page_id from wiki
union all
select user_id, page_id from downloads
union all
select user_id, page_id from polls
union all
select user_id, page_id from videos
) x on
f.user_id = x.user_id
and f.page_id = x.page_id
WHERE
f.page_id = $page_id
AND f.status = 0
group by
f.user_id
ORDER BY PageCount DESC
您希望使用group by
进行聚合,count
函数将忽略您遇到的任何空值,因此仅计算正匹配。
答案 1 :(得分:1)
我找到了解决方案。我以为我早些时候有这个,但我想我一点也没关系。谢谢所有参与的人。
$getfans = mysql_query("SELECT DISTINCT user_id,
(SELECT COUNT(id) FROM wiki WHERE page_id = $page_id AND user_id = favorites.user_id) +
(SELECT COUNT(id) FROM downloads WHERE page_id = $page_id AND user_id = favorites.user_id) +
(SELECT COUNT(id) FROM polls WHERE page_id = $page_id AND user_id = favorites.user_id)
AS posts FROM favorites
WHERE favorites.page_id = $page_id
AND favorites.status = 0
ORDER BY posts DESC", $conn);
继续为每个新表执行带有+的子查询。也许不是最简洁的代码,但它有效。
这很有效。我不能接受它作为两天的答案:(
答案 2 :(得分:-1)
这是我最喜欢的SQL查询,对于一个表,
Select Distinct user_id, Count(user_id) as C from yourtable group by user_id
将向您显示每个人的user_id以及他们在该表中拥有的行数。结合一堆这些结果应该是直截了当的。
顺便说一句,如果所有表都具有相同的结构,为什么不将它们全部放在同一个表中呢?您可以添加一个列,指示记录适用于哪种类型的项目。