【问题标题】:Select from where NOT IN - except从 NOT IN 中选择 - 除外
【发布时间】:2014-02-27 13:45:20
【问题描述】:

我有两个相关的表。 其中一个表包含照片的每个条目,另一个包含每张照片和用户信息的所有猫条目。

photos table:
id
photo (unique filename)
user


cats tables

photo
user
cat

照片

1    photo1.jpg    40000
2    photo2.jpg    40000
3    photo3.jpg    40000
4    photo4.jpg    40001
5    photo5.jpg    40001

photo1.jpg    40000    A
photo2.jpg    40000    A
photo1.jpg    40000    B
photo1.jpg    40000    C
photo2.jpg    40000    P
photo3.jpg    40000    A

可以为每个用户将每张照片分配到更多类别

我想要的是为用户 40000 选择所有未包含在“P”猫中的照片,即使它们可能已包含在“A”或“B”猫中。

因为 photo2.jpg 包含在 P cat 中,所以不应该出现在搜索结果中。 我对用户 40000 的查询应给出以下结果:

photo1
photo3

【问题讨论】:

  • 请显示示例数据和结果应该是什么样子,以及您目前编写的代码。
  • 大概名为cats.photo 的列包含photos.id 中的值。目前尚不清楚您打算在 photos.usercats.user 之间进行什么区分。您是否关心结果集中的照片是否属于AB 类别?还是您只关心他们属于P 类别?
  • 我已经编辑了我的问题

标签: mysql left-join one-to-many notin


【解决方案1】:

应该是一个简单的左连接/空测试

select
      p.id,
      p.photo
   from
      photos p
         left join cats c
            on p.photo = c.photo
            AND c.cat = 'P'
   where
          p.user = 40000
      and c.photo is null

基本上,left join 仍然允许所有照片都合格。但是,如果通过相同的照片和类别 = 'P' 明确存在于类别表中的连接,那么它将具有“c.photo”的值。所以在 where 子句中,我添加了只包含那些不(通过 null)存在于 cat 表中的内容。

【讨论】:

  • @valiD,作为一个新手,根据您内容的增长量,您选择的另一个选项可能会显着降低性能。假设您有 10,000 张猫“P”的照片,而用户 40000 只有 10 张照片,这个版本只会比较有问题的 10 张照片,而不是 10,000 张。但是您对最终答案的要求。
【解决方案2】:
mysql> select * from photos 
       where photo not in (select photo from cats where cat='P') 
       and user = '40000';

【讨论】:

猜你喜欢
  • 2011-12-23
  • 2014-07-18
  • 2021-05-18
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多