我有一个奇怪的问题。 首先让我告诉你我无法改变数据库的制作方式。 在我之前的一些人做得非常好,搞砸了一些非常糟糕的事情。
它是一个新闻网站,有编辑可以编辑其他人发布的新闻帖子。 编辑也可以自己发布新闻。
现在问题。
I have a table for news.
id | news_username (who post news)
news_text Table
news_id | username | news_text
(Here user: can be editor of the news or a person who posted news)
User Table
username | title
在该表中有新闻'id'和新闻'用户名'。 用户名是发布新闻的用户的用户名。 表格中还有更多字段,但它们并不重要。
然后有一个表news_text,并在其中放置新闻的文本。 此表有一个'news_id'和'用户名'字段。 这次用户名是发布新闻的人的字段或编辑帖子的用户的用户名。
然后我有一个用户表,其中还有一个'用户名'字段和一个带有用户标题的'标题'字段。 在此
希望你和我在一起。
简而言之,如果用户发布新闻文章,则文本将位于“news_text”表格内,并且当编辑者编辑帖子时,更改的文本将作为同一文章的新文本插入。 这样做是为了让原始海报看到他的帖子被改变了什么。
现在是我的挑战。 我需要弄清楚如何获得编辑器所做的编辑次数。 但是因为编辑器本身可以发布新闻,这意味着我需要搜索用户名不等于原始海报的所有新闻,以及在news_text表中查找重复项的位置,以查看编辑器编辑了自己的帖子。
我真的希望人们了解我需要做的一些事情。 希望你能帮助我。
这是通过日期/时间字段。 当编辑被放置时,编辑将被插入到news_text字段中,并且将有新编辑的日期/时间戳。 并且随之而来的是它将确定要抓取新闻项目的女巫文本。
希望这很清楚
答案 0 :(得分:1)
如果我理解正确的话,这样的事情应该给出所有用户所做的编辑总数,但仅限于他们自己不在帖子上的位置
SELECT
user.*,
COUNT(*) AS edits
FROM user
// Join posts that aren't this users
INNER JOIN news
ON news.username != user.username
// Join edits for the above posts that are this users
INNER JOIN news_text
ON news_text.news_id = news.id
AND news_text.username != user.username
如果您想选择特定的新闻报道,请使用占位符
SELECT
user.*,
COUNT(*) AS edits
FROM user
// Join posts that aren't this users
INNER JOIN news
ON news.username != user.username
AND news.id = [[SPECIFIC ID]]
// Join edits for the above posts that are this users
INNER JOIN news_text
ON news_text.news_id = news.id
AND news_text.username != user.username
或者,如果您想查看特定用户对特定文章进行了多少次修改
SELECT
user.*,
COUNT(*) AS edits
FROM user
// Join posts that aren't this users
INNER JOIN news
ON news.username != user.username
AND news.id = [[SPECIFIC ID]]
// Join edits for the above posts that are this users
INNER JOIN news_text
ON news_text.news_id = news.id
AND news_text.username != user.username
WHERE user.username = [[SPECIFIC USERNAME]]
编辑备用方法,如果您想要计算用户所做的所有不是原始帖子的帖子,即所有编辑,即使他们正在编辑自己的帖子
SELECT
user.*,
news.*,
COUNT(*)-IF(news.username=user.username,1,0) AS edits
FROM user
// This join will give us all posts made by user
INNER JOIN news_text
ON news_text.username = user.username
// Also join the news id
INNER JOIN news
ON news_text.news_id = news.id
GROUP BY user.username, news.id
这将为每个用户返回每行1行。计算用户对其进行的编辑次数,因此,为了获取此值并返回总计,您可以执行此操作以返回单个用户执行的编辑次数。名称
SELECT
username,
sUM(edits)
FROM (
SELECT
news_text.username.username,
COUNT(*)-IF(news.username=news_text.username,1,0) AS edits
FROM news_text
ON news_text.username = [[USER TO CHECK]]
// Also join the news id
INNER JOIN news
ON news_text.news_id = news.id
GROUP BY news.id
)
答案 1 :(得分:0)
我建议最简单的方法是两个查询:
一个用于查找用户所做更改的总数
e.g。 SELECT COUNT(*) FROM news_text WHERE username = {USERNAME} GROUP BY username
然后找一个该用户创建的帖子总数
e.g。 SELECT COUNT(*) FROM news WHERE username = {USERNAME} GROUP BY username
从另一个中减去一个。
或者对所有用户进行查询,然后取出您需要的用户。 (或者如果你真的想要将它们组合成一个查询)。
答案 2 :(得分:0)
据我了解,您有特定新闻项(news_id)的重复news_text行。此外,您在news_text表上有一个edit_date字段,并且您将获得带有最新edit_date的news_text以获取最新版本的新闻项。
我也理解您希望获得每个用户的编辑次数,不包括自编辑。
这是一个解决方案。这适用于特定用户:
SELECT COUNT(*) AS edits
FROM user u
JOIN news n
ON n.username <> u.username
JOIN news_text nt1
ON nt1.news_id = n.news_id
AND nt1.username = u.username
JOIN news_text nt2
ON nt2.news_id = n.news_id
AND nt2.edit_date < nt1.edit_date
AND nt2.username <> u.username
LEFT JOIN news_text nt3
ON nt3.news_id = n.news_id
AND nt3.edit_date > nt2.edit_date AND nt3.edit_date < nt1.edit_date
WHERE u.username = 'myuser'
AND nt3.news_id IS NULL
ON n.username <> u.username
)ON nt1.news_id = n.news_id AND nt1.username = u.username
)ON nt2.news_id = n.news_id
AND nt2.edit_date < nt1.edit_date AND nt2.username <> u.username
)ON nt3.news_id = n.news_id
AND nt3.edit_date > nt2.edit_date AND nt3.edit_date < nt1.edit_date
)WHERE u.username = 'myuser'
)nt3.news_id IS NULL
)