0

我有两个表: TrackingFiles

  • Tracking 包含很多以 track_id 作为主键的字段。
  • Files 包含一个file_id、track_id、filename 和approved。

track_id显然是将文件记录链接回跟踪记录。可以是同一track_id的多个文件记录

我需要做的是显示跟踪中的所有记录的列表,其中包含未批准的文件。

现在为了测试,我有一个跟踪记录,其中有 3 个与之关联的文件。我的想法是使用 Left Join 和以下语句:

   SELECT * 
     FROM tracking 
LEFT JOIN files ON tracking.track_id = files.track_id 
    WHERE (tracking.archived = '0' AND approved = '0') 
 ORDER BY tracking.po_number;

但是,这会将相同的记录返回给我 3 次。我想我需要在某个地方添加一个独特的子句,但是我认为它应该去的每个地方都会给我一个 SQL 语句错误。

4

2 回答 2

2

如果您只想匹配两个表中都存在的 id,则应该使用内部联接。为避免重复,请使用 distinct

 SELECT distinct [list of columns] 
 FROM tracking, files 
 WHERE tracking.track_id = files.track_id  AND 
       tracking.archived = '0' AND approved = '0'
 ORDER BY tracking.po_number;
于 2012-08-05T22:17:14.113 回答
1
SELECT    a.*
FROM      tracking a
JOIN      (
          SELECT   track_id
          FROM     files
          WHERE    approved = 0
          GROUP BY track_id
          ) b ON a.track_id = b.track_id
WHERE     a.archived = 0
ORDER BY  a.po_number
于 2012-08-05T22:25:23.173 回答