我正在尝试进行过滤,以查找由各种stuffs
组成的所有substances
。
在数据库中,有:
stuffs
表substances
表stuffs_substances
连接表。 现在,我只想查找由stuffs
和gold
组成的所有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%')
它返回一个空数组。我在这里做错了什么?
答案 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.id
是stuffs
中的主键,这是可行的。
我不理解您对双引号和长表别名的迷恋。对我来说,这些事情只会使查询更难编写和阅读。
答案 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%'