【问题标题】:mysql duplicate select and subtract 1 from the duplicatesmysql重复选择并从重复项中减去1
【发布时间】:2012-03-08 21:28:29
【问题描述】:

我有一个奇怪的问题。 首先让我告诉你我不能改变数据库的制作方式。 在我之前的一些人做得非常好,把一些事情搞砸了。

它是一个新闻网站,其中有编辑可以编辑其他人发布的新闻帖子。 编辑也可以自己发布新闻。

现在是问题。

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”和“username”字段。 这次用户名是发布新闻的人的字段或编辑帖子的用户的用户名。

然后我有一个用户表,其中还有一个“用户名”字段和一个带有用户标题的“标题”字段。 在这个

希望你还在我身边。

简而言之,如果用户发布新闻文章,则文本将位于“news_text”表中,并且当编辑器编辑帖子时,更改后的文本将作为同一篇文章的新文本插入。 这样做是为了让原始发帖人看到他的帖子发生了什么变化。

现在是我的挑战。 我需要弄清楚如何获得编辑器所做的编辑数量。 但是因为编辑器本身可以发布新闻,这意味着我需要搜索用户名不等于原始发布者的所有新闻,并且在 news_text 表中查找重复项以查看编辑器编辑了他自己的帖子。

我真的希望人们对我需要做的事情有所了解。 希望你能帮助我。


在评论中,Marcus Adams 向我指出了网站上最新编辑的使用方式。

这是通过日期/时间字段进行的。 放置编辑时,编辑将被插入到 news_text 字段中,并且会有新编辑的日期/时间戳。 然后它将确定要抓取新闻项目的女巫文本。

希望这很清楚

【问题讨论】:

  • 您如何确定要为特定 news_id 显示哪个 news_text 行?最高身份证?最晚日期?
  • 请务必查看我的答案,它解释了自我编辑。

标签: mysql select count duplicates subtraction


【解决方案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

这将为每个 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
)

【讨论】:

  • 不确定他是否希望包含所有编辑,但很容易完成
  • 我认为只要稍微调整一下,您的代码就会为我工作:) thnks 的帮助。当我得到它的工作,我会告诉你。再次感谢。并且关于编辑自己的新闻项目。我认为代码可以稍作调整;)
  • 这里我又添加了一些建议,也许可以具体做你所追求的:)
【解决方案2】:

我建议最简单的方法是在两个查询中:

查找用户所做更改的总数

例如SELECT COUNT(*) FROM news_text WHERE username = {USERNAME} GROUP BY username

然后查找该用户创建的帖子总数

例如SELECT COUNT(*) FROM news WHERE username = {USERNAME} GROUP BY username

然后从另一个中减去一个。

或者对所有用户进行查询,然后取出你需要的那些。 (或者如果你真的想将它们组合成一个查询)。

【讨论】:

    【解决方案3】:

    据我了解,您对特定新闻项目 (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 &lt;&gt; u.username) 创作的新闻项目
    • 然后它收集我们用户编辑的每个新闻项目的所有 news_texts (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)

    【讨论】:

    • 针对用于确定最新版本而不是 auto_increment 的 edit_date 字段的答案进行了编辑。
    • WHERE 子句之一移到应该在的ON 子句中。
    • 我已经对其进行了一些优化,假设第一个 news_text 始终来自原作者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多