mysql重复选择并从重复项中减去1

时间:2012-02-17 13:18:47

标签: mysql select count duplicates subtraction

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

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

现在问题。

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表中查找重复项的位置,以查看编辑器编辑了自己的帖子。

我真的希望人们了解我需要做的一些事情。 希望你能帮助我。


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

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

希望这很清楚

3 个答案:

答案 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
  • 然后它会收集我们用户编辑的每个新闻项目的所有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