情境:
我有一张主表,说“items
”。每个项目可以有多种类型,我使用表格“types
”和链接表来保持两者之间的关系,比如典型的一对多情况中的“items_types
”。现在,每种类型都有一个超类型,具有直接的一对一关系。
items: i_id, i_name
types: t_id, t_name, t_st_id
items_types: it_id, it_i_id, it_t_id
supertypes: st_id, st_name
现在我必须过滤与给定集合中至少一个超类型相关的所有项目,比如带有ID的超类型1,2,3
我正在考虑对相关超类型的ID使用group_concat
,然后使用FIND_IN_SET
子句在彼此之间或之间使用多个WHERE
进行过滤。
然而,如果工作,这将减慢查询速度,我不喜欢比较ID,就像它们是字符串一样。
有什么想法吗?
答案 0 :(得分:0)
你可以这样做。
select i.*
from items_types it
join items i on i.i_id = it.it_i_id
join types t on t.t_id = it.it_t_id
join supertypes st on st.st_id = t.t_st_id and st_id in (1,2,3)
答案 1 :(得分:0)
我找到了一个更好的解决方案:使用相关记录来跟踪项目所属的所有类型,我给每种类型一个可用于二进制比较的数字代码,例如:
Type 1: code 1 Type 2: code 2 Type 3: code 4 Type 4: code 8 Type 5: code 10
我想我提出了这个想法。
每个项目都有一个字段来跟踪其所有类型,名为“coded_type”。例如,如果字段具有coded_type 7,则表示它属于类型1,类型2,类型3。
例如,如果用户想要查找类型为2或3的所有项,则查询将查找其编码类型字段二进制AND与6的值大于零的所有项。
那是:
select * from items where (coded_type & 6)>0
我认为这样查询会更简单,运行速度更快。对不起我刚想到这个。