将两次链接到同一个 table
Linking two times to the same table
背景:
我正在建立一个图片数据库来管理我制作的所有照片。我有很多 RAW 文件(底片)和很多 JPG 文件(副本)。大多数 JPG 是 RAW 文件的编辑版本,但有些 JPG 没有对应的 RAW 文件(例如,我用智能手机拍摄的照片)。
因此,一张图片可以由单个 JPG 文件或一个 JPG 和一个相应的 RAW 文件组成。
我想明确区分两种情况:
- 没有 JPG 的 RAW 文件(例如智能手机)
- 有照片的 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
背景: 我正在建立一个图片数据库来管理我制作的所有照片。我有很多 RAW 文件(底片)和很多 JPG 文件(副本)。大多数 JPG 是 RAW 文件的编辑版本,但有些 JPG 没有对应的 RAW 文件(例如,我用智能手机拍摄的照片)。 因此,一张图片可以由单个 JPG 文件或一个 JPG 和一个相应的 RAW 文件组成。
我想明确区分两种情况:
- 没有 JPG 的 RAW 文件(例如智能手机)
- 有照片的 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