我有四张桌子:
物品:
id | 名字 |
---|---|
1 | 第 1 项 |
2 | 第 2 项 |
项目模块:
item_id | 模块_id |
---|---|
1 | 1 |
1 | 2 |
1 | 3 |
模块:
id | 名字 | 类型 |
---|---|---|
1 | 模块1 | 类型_1 |
2 | 模块2 | 类型_2 |
3 | 模块3 | 类型_2 |
4 | 模块 4 | 类型_3 |
输入优先级:
id | 类型 | 优先 |
---|---|---|
1 | 类型_1 | 14 |
2 | 类型_2 | 20 |
3 | 类型_3 | 27 |
项目可以有许多模块。模块按其类型具有优先级。我怎样才能获得所有具有最高优先级的项目模块?因此,该表的结果应该是具有“模块 2”和“模块 3”的项目,因为该项目没有“模块 4”,并且“模块 1”的优先级低于“模块 2”和“模块 3”。所以输出的 ex 是
items [
id: 1,
name: item 1,
modules: [
[
id: 2,
name: module 2
],
[
id: 3,
name: module 3
]
]
]
表格结果应如下所示:
item_id | 商品名称 | 模块_id | 模块名称 |
---|---|---|---|
1 | 第 1 项 | 2 | 模块2 |
1 | 第 1 项 | 3 | 模块3 |
但是如果我们为项目添加“模块 4”,那么项目应该只有“模块 4”。仅当我们删除所有其他模块时,“模块 1”才应出现在输出中
你可以添加一个带有查询的where子句,像这样
select i.itemid,
i.itemname,
m.moduleid,
m.modulename,
p.priority
from items i
inner join itemmodule im on i.itemid = im.itemid
inner join module m on im.moduleid = m.moduleid
inner join priority p on m.type = p.type
where p.priority = ( select max(p2.priority)
from priority p2
inner join module m2 on p2.type = m2.type
inner join itemmodule im2 on m2.moduleid = im2.moduleid
where im2.itemid = i.itemid
)
这将检索所有表中具有连接的所有项目,
然后过滤掉那些不是最高优先级的
返回您的数据
项目中 | 商品名称 | 模块ID | 模块名称 | 优先 |
---|---|---|---|---|
1 | 项目 | 1 | 2 | 模块2 |
1 | 项目 | 1 | 3 | 模块3 |
如果我添加模块 4,结果是
项目中 | 商品名称 | 模块ID | 模块名称 | 优先 |
---|---|---|---|---|
1 | 项目 | 1 | 4 | 模块 4 |