Сокращение набора записей, когда конкретное поле имеет аналогичные данные. (Баз данных) - PullRequest
1 голос
/ 20 января 2010

У меня есть две таблицы: «обсуждение» и «обсуждение_ответов». Уникальный идентификатор из «Обсуждения» используется в «Обсуждение_ответов» для определения ответа на исходное сообщение на форуме. Я создал следующий запрос для извлечения сообщений, которые имеют НОВЫЕ ответы, но НЕ связаны с новыми темами. В обеих таблицах есть поле для добавленной даты, а «colname» - это имя переменной Dreamweaver для последней даты входа посетителя, полученной из другой таблицы:

SELECT *
FROM discussion, discussion_responses
WHERE discussion.discussion_date < colname 
AND discussion_responses.discussion_date > colname 
AND discussion.discussion_ID = discussion_responses.discussion_ID
ORDER BY discussion.discussion_title ASC

Моя проблема в том, что если на исходное сообщение было сделано более одного ответа, я, естественно, получаю более одного результата для этого идентификатора обсуждения. Может кто-нибудь, пожалуйста, посоветуйте мне, как я могу удалить последующие строки, содержащие один и тот же параметр Discussion_ID? Неважно, какая запись выбрана, только то, что я получаю идентификатор любой темы, с которой связан новый ответ. Спасибо.

Ответы [ 2 ]

1 голос
/ 20 января 2010

Это:

SELECT  *
FROM    discussion d
WHERE   discussion_date < colname 
        AND EXISTS
        (
        SELECT  NULL
        FROM    discussion_responses dr
        WHERE   dr.discussion_date > colname 
                AND dr.discussion_ID = d.discussion_ID
        )
ORDER BY
        d.discussion_title ASC

или это:

SELECT  d.*
FROM    (
        SELECT  DISTINCT discussion_ID
        FROM    discussion_responses dr
        WHERE   dr.discussion_date > colname
        )
JOIN    discussion d
ON      d.discussion_ID = dr.discussion_ID
WHERE   d.discussion_date < colname 
ORDER BY
        d.discussion_title ASC

Последний запрос, вероятно, будет быстрее, поскольку условие, используемое в ведущей таблице второго запроса (discussion_responses), более избирательно.

Создать индекс для discussion_responses (discussion_date, discussion_id).

0 голосов
/ 20 января 2010

Если вас просто интересует обсуждение_ID, вы можете использовать различные или группировать по. Вот пример с отчетливым:

SELECT      DISTINCT discussion_ID
FROM        discussion d
INNER JOIN  discussion_responses dr
ON          d.discussion_ID = dr.discussion_ID
WHERE       d.discussion_date < colname 
AND         dr.discussion_date > colname 

Если вас также интересуют другие столбцы, отфильтруйте отдельные идентификаторы в подзапросе:

SELECT      *
FROM        discussion d
WHERE       d.discussion_ID IN (
    <query from above here>
)
...