只选择n:m表中的剩余记录?

时间:2012-11-30 22:29:00

标签: php mysql

我想选择所有尚未包含在n:m类型的查询中的记录...

我有一张名为'artwork'的表格,如下所示:

artwork_id  caption                              filename
---------------------------------------------------------------
1           Moonlight Front cover                3483490.jpg
2           Take it Inlay                        2984560.jpg
3           Moonlight Front Cover (UK Release)   gh893ed.jpg
4           CD ....                              86re956.jpg
5           CD 3 ...                             84wefg8.jpg

我有一个名为'album_artwork'的n:m表,如下所示:

album_id  artwork_id  position
-------------------------------
1         1           1
23        1           1
8         2           5
1         2           2

我有一个表单,允许用户选择相册的图稿,但我不希望用户重复输入...所以我想向用户显示剩余的图片......例如,对于id为1的相册,选择输入将显示以下选项

3 Moonlight Front Cover (UK Release)
4 CD ...
5 CD 3 ...

artwork_id 1和arts_id 2将不会成为选项的一部分,因为album_id 1的artwork_id条目已经存在于n:m album_artwork数据库中

我如何只选择其余的?

由于

2 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS过滤artwork_id中已存在的album_artwork

SELECT
  a.*
FROM 
  artwork a
WHERE
  NOT EXISTS (
    /* NOT EXISTS subquery returns artwork_id's from album_artwork already present */
    SELECT artwork_id FROM album_artwork aw 
    WHERE
      album_id = $your_album_id
      AND a.artwork_id = aw.artwork_id
  )
SQLFiddle.com上的

Here is a demonstration

答案 1 :(得分:1)

您可以使用NOT IN仅为已知artwork选择不在已使用artwork数组中的album行。

SELECT
 artwork_id,caption,filename
FROM 
 artwork
WHERE
 artwork_id
NOT IN
   (SELECT artwork_id FROM album_artwork WHERE album_id = $album_id)

sqlfiddle example