mysql按链接表中的字段值过滤行

时间:2017-02-01 17:29:41

标签: php mysql

情境:

我有一张主表,说“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,就像它们是字符串一样。

有什么想法吗?

2 个答案:

答案 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

我认为这样查询会更简单,运行速度更快。对不起我刚想到这个。