如果相关表中有多个值,如何选择行

时间:2018-11-29 13:07:05

标签: sql postgresql

我正在尝试进行过滤,以查找由各种stuffs组成的所有substances

在数据库中,有:

  • stuffs
  • substances
  • 一个stuffs_substances连接表。

现在,我只想查找由stuffsgold组成的所有silver(不是所有包含金的材料和所有包含银的材料)。

最后一件事:最终用户只能在过滤器表单字段中键入物质名称的一部分。例如,他将键入silv,它将显示所有由silver制成的东西。

所以我做了这个查询(不起作用):

select "stuffs".* 
from "stuffs" 
  inner join "stuffs_substances" as "substances_join"
    on "substances_join"."stuff_id" = "stuffs"."id" 
  inner join "substances" 
    on "substances_join"."substance_id" = "substances"."id" 
where ("substances"."name" like '%silv%') 
and ("substances"."name" like '%gold%')

它返回一个空数组。我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

基本上,您只需要聚合:

select st.*
from "stuffs" st join
     "stuffs_substances" ss join
     on ss."stuff_id" = st."id" join
     "substances" s
     on ss."substance_id" = s."id" 
where s."name" like '%silv%' or 
      s."name" like '%gold%'
group by st.id
having count(*) filter (where s."name" like '%silv%') > 0 and
       count(*) filter (where s."name" like '%gold%') > 0;

请注意,假设stuff.idstuffs中的主键,这是可行的。

我不理解您对双引号和长表别名的迷恋。对我来说,这些事情只会使查询更难编写和阅读。

答案 1 :(得分:0)

如果您要按单词搜索,则每次用户输入单词字母时都要执行操作以重新运行查询,如果使用oracle sql方式,则在查询中使用过滤器部分 如果只搜索起始部分

x & mask

或单词的任何部分

def uniform_random_bit_from_mask(mask):
  assert mask > 0
  set_indices = get_set_indices(mask)
  random_index = uniform_random_choice(set_indices)
  new_mask = set_bit(random_index, 0)
  return new_mask

您还可以使用CAB,以确保用户可以按大写字母或小写字母进行搜索

答案 2 :(得分:-1)

好吧,您问有关加入的问题,我在mysql中对此进行了测试,发现可以用金,银或银等制成的东西有用,希望有帮助

select sf.id, ss.code, sf.stuff_name from stuffs sf, stuffs_substances ss , substances s
where sf.id = ss.id
and  s.code = ss.code
and s.sub_name like  'gol%'