簡體   English   中英

SQL左聯接:選擇最后一條記錄

[英]SQL left join: selecting the last records

我有一個項目表和一個意見表。 一個項目可以有很多評論。 我想獲取所有發布的評論> 30天或沒有評論的項目的列表。 做到這一點的最佳方法是什么?

我嘗試了許多失敗的嘗試; 這是我最新的嘗試。

SELECT p.id, 
       p.officialStatus, 
       c.posted 
  FROM projects p 
       LEFT JOIN 
       (
        SELECT max(posted) as posted, 
                   projectid 
          FROM comments 
             WHERE DATEDIFF(day, posted, GETDATE()) > 30 
                   OR comment IS NULL
               group by projectid
        ) c ON p.id = c.projectid 
 WHERE (p.officialStatus NOT IN ('Blue', 'Canceled'))

請在您的答案中使用這些表/列名稱:

  • 項目:id,officialStatus
  • 評論:id,projectID,postedOn
SELECT projects.id FROM projects
  LEFT JOIN
    (SELECT comments.projectID 
       FROM comments
      GROUP BY comments.projectID
      HAVING DATEDIFF(Now(), MAX(comments.postedOn)) < 30) AS C
  ON projects.id = C.projectID
  WHERE C.projectID IS NULL;

http://sqlfiddle.com/#!2/ec919/14

 SELECT PROJ.id,
        PROJ.officialStatus
   FROM Projects PROJ
        LEFT JOIN
        (
            SELECT projectid, MAX(posted) AS max_posted
              FROM Comments 
                   GROUP BY projectid
        )  COMMENTS ON PROJ.id = COMMENTS.projectid
  WHERE PROJ.officilstatus NOT IN ('Blue', 'Cancelled)
        AND COMMENTS.max_posted IS NULL
         OR COMMENTS.max_posted >= DATEADD(day, -30, Now())

我認為您的主要問題是外部聯接,這正是您所不需要的...在此調整中,沒有注釋的項目的max_posted日期為NULL。

select p.*, max(c.postedOn) as postedDate from Projects p
left join Comments c on p.id = c.projectId
group by p.id
having COALESCE( postedDate, DATE_SUB(CURRENT_DATE, INTERVAL 31 DAY ) ) < 
    DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY );

http://sqlfiddle.com/#!2/ec919/17-以及執行計划(感謝@Barbara在sqlfiddle上准備此測試)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM