2012-02-17 4 views
1

私はちょっと奇妙な質問があります。 まず、データベースの作成方法を変更できないことを教えてください。 私の前の人の中には、かなり悪いものを混乱させる本当の良い仕事がありました。mysql duplicateは重複から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」とニュース「username」があります。 ユーザー名は、ニュースを投稿したユーザーのユーザー名です。 テーブル内にはさらに多くのフィールドがありますが、重要ではありません。

次に、news_textという表があり、その中にニュースのテキストが配置されています。 このテーブルには 'news_id'と 'username'フィールドがあります。 今回は、ユーザー名はニュースを投稿した人のフィールド、または投稿を編集したユーザーのユーザー名です。

私はまた、 'username'フィールドと 'title'フィールドとユーザーのタイトルを持つユーザーテーブルを持っています。 この中に

私にはまだあなたの希望があります。

ユーザーがニュース記事を投稿すると、テキストは 'news_text'表の中にあり、編集者が投稿を編集すると、変更されたテキストが同じ記事の新しいテキストとして挿入されます。 これは元のポスターに自分の投稿に何が変更されたかを見せるために行われます。

は現在私の挑戦になります。 私は編集者が行った編集の回数をどのように得ることができるかを理解する必要があります。 しかし、編集者自身がニュースを投稿できるということは、ユーザー名が元のポスターと同じではないすべてのニュースを検索する必要があり、news_textテーブルの重複を探す場所が自分の投稿を編集したことを意味します。

私は実際に人々が私が何をする必要があるのか​​理解してくれることを願っています。 あなたが私を助けることを願っています。


コメントにMarcus Adamsは、最新の編集がウェブサイトでどのように使用されたかを教えてくれました。

これは、日付/時刻フィールドには含まれません。 編集が配置されると、編集はnews_textフィールドに挿入され、新しい編集の日付/時刻スタンプがあります。 それで、それはニュース項目のためにつかむ魔法使いのテキストを決定するでしょう。これは私が正しく理解していれば、このようなものは、すべてのユーザーが作ったが、彼らは自分たち

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 

なかったの記事にあった場合にのみ編集の総数を与える必要があります明らか

+0

を持って確保し、現在および以前の間にあった編集内容をフィルタリングし、当社のユーザー(WHERE u.username = 'myuser'

  • 用フィルタ特定のnews_idに対して表示するnews_text行を決定しますか?最高のIDですか?最新の日付? –

  • +0

    自分の編集を考慮した自分の答えをチェックアウトしてください。 –

    答えて

    1

    ある

    希望そしてプレースホルダを使用すると、特定のニュース記事を選択したい場合は

    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 
    

    それともあなたは、特定のユーザーが。仕上で行っているどのように多くの編集を参照したい場合C記事

    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]] 
    

    EDIT代替的なアプローチは、元の投稿されていないユーザーによって行われたすべての記事をカウントアップしたい場合、彼らは

    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行を返します。これを受け取り、合計を返します。これを行うと、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 
    ) 
    
    +0

    彼はすべての編集が含まれているかどうかは分かりませんでしたが、簡単に実行しました –

    +0

    私はちょっと微調整して、ここであなたのコードは私のために働くだろうと思っています。私はそれを働かせたら私はあなたに知らせるでしょう。再びthks。編集者自身のニュース項目にも注意してください。私はコードが少し微調整で動作すると思う) – Controvi

    +0

    私はいくつかの提案を追加した後、あなたが何をしているかを具体的に行うことができるかもしれません:) –

    0

    私はこれを行う最も簡単な方法は、2つのクエリであることを示唆している:ユーザー

    例えばによって行われた変更の合計数を見つけるために

    ワンSELECT COUNT(*) FROM news_text WHERE username = {USERNAME} GROUP BY username

    そして1は、そのユーザ

    例えばによって作成された合計の記事を見つけるためにSELECT COUNT(*) FROM news WHERE username = {USERNAME} GROUP BY username

    そして、一方を他方から引きます。

    また、すべてのユーザーに対してクエリを実行し、必要なものを取り出してください。 (あるいは、本当に欲しいのであればそれらを1つのクエリーに組み合わせる)。

    0

    私が理解しているように、特定のニュース項目(news_id)のnews_text行が重複しています。また、news_textテーブルにedit_dateフィールドがあり、ニュースアイテムの最新バージョンを取得するために最新のedit_dateでnews_textを取得しています。

    また、自己編集を除いて、各ユーザーからの編集回数を取得したいと思います。

    ここに1つの解決策があります。これは、特定のユーザーのためにある:

    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 nt2.news_id = n.news_id AND nt2.edit_date < nt1.edit_date AND nt2.username <> u.username
    • からのものである上記のすべての以前のバージョンを収集し、当社のユーザ編集(ON nt1.news_id = n.news_id AND nt1.username = u.username
    • そしてそれが(012後排除するために、現在のものと前の間の任意のバージョンを収集すること)
    • そして、それはそれは我々だけですどのようにバージョン)nt3.news_id IS NULL(直前
    +0

    auto_incrementの代わりに最新のバージョンを判別するために使用されるedit_dateフィールドに関する解答のために編集されました。 –

    +0

    'WHERE'節の1つを' ON'節に移動しました。 –

    +0

    最初のnews_textが元の著者のものであると仮定して、私はそれをいくつか最適化しました。 –

    関連する問題