1

我有两个表,“讨论”和“讨论响应”。'discussion' 中的唯一 ID 用于 'discussion_responses' 以识别对论坛中原始帖子的响应。我创建了以下查询来提取具有新回复但未链接到新主题的帖子。两个表都有一个添加日期字段,“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

我的问题是,如果对原始帖子做出了不止一个回复,我自然会得到该讨论 ID 的多个结果。谁能告诉我如何消除包含相同讨论ID的后续行?选择哪条记录并不重要,只要我得到任何有与之关联的新回复的主题的 ID。谢谢。

4

2 回答 2

1

这个:

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)

于 2010-01-20T16:16:48.267 回答
0

如果您只对讨论 ID 感兴趣,可以使用 distinct 或 group by。这是一个不同的例子:

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 

如果您还对其他列感兴趣,请在子查询中过滤不同的 id:

SELECT      *
FROM        discussion d
WHERE       d.discussion_ID IN (
    <query from above here>
)
于 2010-01-20T16:11:31.160 回答