Вопрос

У меня немного странный вопрос. Сначала позвольте мне сказать вам, что я не могу изменить способ создания базы данных. Некоторые люди до меня сделали действительно хорошую работу, чтобы испортить некоторые вещи довольно плохо.

Это новостной сайт, и есть редакторы, которые могут редактировать новостные сообщения, которые публикуют другие. Также редакторы могут опубликовать новости о себе.

Теперь вопрос.

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, и для нового редактирования будет отметка дата/времени. И с этим это определит текст ведьмы, чтобы захватить новостную статью.

Надеюсь, это ясно

Это было полезно?

Решение

Если я правильно понимаю, что -то подобное должно дать общее количество изменений, которые были сделаны все пользователи, но только там, где они были на постах, которые не были сами

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
)

Другие советы

Я бы предложил, чтобы самый простой способ сделать это - два запроса:

Один, чтобы найти общее количество изменений, внесенных пользователем

например SELECT COUNT(*) FROM news_text WHERE username = {USERNAME} GROUP BY username

А затем один, чтобы найти общие сообщения, созданные этим пользователем

например SELECT COUNT(*) FROM news WHERE username = {USERNAME} GROUP BY username

И вычтите один из другого.

Или выполните запросы для всех пользователей и просто выньте те, которые вам нужны. (Или объедините их в один запрос, если вы действительно хотите).

Насколько я понимаю, у вас есть дублирующие строки news_text для конкретного элемента новостей (News_id). Кроме того, у вас есть поле edit_date в таблице News_text, и вы получаете The 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)
  • Затем он собирает все новости для каждого из тех предметов новостей, которые наш пользователь отредактировал (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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top