将两次链接到同一个 table

Linking two times to the same table

背景: 我正在建立一个图片数据库来管理我制作的所有照片。我有很多 RAW 文件(底片)和很多 JPG 文件(副本)。大多数 JPG 是 RAW 文件的编辑版本,但有些 JPG 没有对应的 RAW 文件(例如,我用智能手机拍摄的照片)。 因此,一张图片可以由单个 JPG 文件或一个 JPG 和一个相应的 RAW 文件组成。

我想明确区分两种情况:

  1. 没有 JPG 的 RAW 文件(例如智能手机)
  2. 有照片的 RAW 文件,但我还没有在备份中找到它。

这就是我的数据库目前的样子:

SELECT * FROM pictures
*------*------------*------------*--------*
| p_id | p_complete | p_negative | p_copy |
*------*------------*------------*--------*
| 1    | true       | 1          | 2      |
| 2    | true       | null       | 3      |
| 3    | false      | null       | 4      |
*------*------------*------------*--------*

SELECT * FROM files
*------*--------*
| f_id | f_path |
*------*--------*
| 1    | a.raw  |
| 2    | a.jpg  |
| 3    | b.jpg  |
| 4    | c.jpg  |
*------*--------*

我想要的是构建一个查询来获取所有图片。结果应该是:

*----*----------*----------*-------*
| id | complete | negative | copy  |
*----*----------*----------*-------*
| 1  | true     | a.raw    | a.jpg |
| 2  | true     | null     | b.jpg |
| 3  | false    | null     | c.jpg |
*----*----------*----------*-------*

我尝试了什么:

SELECT p_id as id,
       p_complete as complete,
       f1.f_path as negative,
       f2.f_path as copy
FROM pictures as p,
     files as f1,
     files as f2
WHERE ((f1.f_id = p.p_negative) OR (p.p_negative=null)) AND
      f2.f_id = p.p_copy

这个结果是:

*----*----------*----------*-------*
| id | complete | negative | copy  |
*----*----------*----------*-------*
| 1  | true     | a.raw    | a.jpg |
*----*----------*----------*-------*

我不想要的。

我应该更改我的设计吗?如果是,如何更改? 或者是否可以编写一个我想要的查询?

SELECT a.p_id id, a.p_complete complete, b.f_path negative, c.f_path copy FROM pictures a
left join files b on a.p_negative=b.f_id
left join files c on a.p_copy=c.f_id