2012-02-17 71 views
1

我有点奇怪的问题。首先让我告诉你,我不能改变数据库的制作方式。 在我之前的一些人做了一些非常糟糕的工作。mysql重复选择并从重复中减去1

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

现在的问题。

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

怎么样你决定为特定的news_id显示哪个news_text行?最高ID?最近的日期? – 2012-02-17 13:45:32

+0

请务必查看我的答案,其中包含自我编辑。 – 2012-02-17 14:54:09

回答

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 

或者,如果你想看看有多少编辑一个特定的用户已经在specifi做也许ç文章

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行每news.id统计用户对它进行的编辑的数量,因此要采取此操作并返回总计,您可以这样做,以返回单个用户按名称执行的编辑数

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 
) 
+0

不确定他是否希望所有编辑都包含在内或不包含tbh,但很容易完成 – 2012-02-17 13:54:48

+0

我认为只需稍微调整一下这些代码就可以为我工作:)帮助。当我有它的工作,我会让你知道。再次thks。并编辑自己的新闻项目。我认为代码将工作一点点调整;) – Controvi 2012-02-17 13:56:37

+0

在那里我已经添加了几个建议,也许能够具体做你的后面:) – 2012-02-17 14:03:13

0

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

一个找到用户

例如所做的更改总数SELECT COUNT(*) FROM news_text WHERE username = {USERNAME} GROUP BY username

然后一个找到该用户

例如产生的总帖SELECT COUNT(*) FROM news WHERE username = {USERNAME} GROUP BY username

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

或者为所有用户查询,只是拿出你需要的。 (或者如果你真的想把它们合并成一个查询)。

0

据我所知,你有一个特定的新闻项目(news_id)重复的news_text行。另外,你在news_text表上有一个edit_date字段,并且你得到news_text和最新的edit_date来获取最新版本的新闻项目。

我也明白,您希望获得来自每个用户的编辑数量,不包括自编辑。

下面是一个解决方案。这是一个特定的用户:

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
+0

编辑有关edit_date字段的答案,用于确定最新版本而不是auto_increment。 – 2012-02-17 14:35:51

+0

将其中一个'WHERE'子句移入它应该出现的'ON'子句中。 – 2012-02-17 14:47:18

+0

我已经优化了一些,假设第一个news_text始终来自原作者。 – 2012-02-17 14:51:58