我通常知道如何提出详细的问题,但这很难描述。
这是一个非常简单的概念,但我不知道该怎么称呼。
可以说,用户投入的"材料" a,b,c,d"。我想返回所有可以用这些材料进行的"项目"。假设我的项目1、2、3和4分别需要[A,C],[D,F,G],[A,B,C,R,Q]和[A,C,D]。我想返回1和4,因为可以制作它们,而2和3不能返回。
清楚吗?我不确定该怎么称呼。另外,关于表设置的任何建议吗?我很容易拥有一个具有1个恋爱关系的项目表和项目需求表。
想到的第一件事是扭转条件。如果您正在寻找只能用手头材料制定的所有项目,这意味着您正在寻找所有项目,除了需要材料的项目。这可以用表示不存在很容易表达。
假设您有两个表Projects
和ProjectMaterials
,一个查询看起来像:
select *
from Projects p
where not exists (
select 1
from ProjectMaterials pm
where pm.ProjectId = p.Id
and pm.MaterialId not in ('A', 'B', 'C', 'D')
)
此查询应该相对较低,但对于您的特定变体而言,当然会根据需要进行更改。
关于桌面设计,我会推荐一个用于项目的桌子和一张材料表,并加入了多个
。我使用上面的示例数据创建了此查询和结构的SQL小提琴演示。
如果我假设您有一个称为 ProjectMaterials
的表(如@lc。做),则可以使用条件聚合:
select pm.projectid
from ProjectMaterials pm
group by pm.projectid
having sum(case when pm.materialid not in ('A', 'B', 'C', 'D') then 1 else 0 end) = 0;
CREATE TABLE IF NOT EXISTS `products` (
`id` int unsigned NOT NULL,
`product` varchar(255) NOT NULL,
`status` smallint NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `products` (`id`, `product`, `status`) VALUES
(1,'A',1),
(2,'B',1),
(3,'C',1),
(4,'D',1),
(5,'E',0),
(6,'F',0),
(7,'G',0),
(8,'R',0);
CREATE TABLE IF NOT EXISTS `projects` (
`id` int unsigned NOT NULL,
`project` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `projects` (`id`, `project`) VALUES
(1,'1'),
(2,'2'),
(3,'3'),
(4,'4');
CREATE TABLE IF NOT EXISTS `projects_products` (
`project_id` int unsigned NOT NULL,
`product_id` int unsigned NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `projects_products` (`project_id`, `product_id`) VALUES
(1,1),
(1,3),
(2,2),
(2,6),
(2,7),
(3,1),
(3,2),
(3,3),
(3,8),
(3,9),
(4,1),
(4,3),
(4,4);
select * from project where id not in (
select distinct b.id from projects_products a join projects b
on a.project_id = b.id
left join products c
on a.product_id = c.id
where c.status <> 1)