SQL返回如果设置匹配



我通常知道如何提出详细的问题,但这很难描述。

这是一个非常简单的概念,但我不知道该怎么称呼。

可以说,用户投入的"材料" 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个恋爱关系的项目表和项目需求表。

想到的第一件事是扭转条件。如果您正在寻找只能用手头材料制定的所有项目,这意味着您正在寻找所有项目,除了需要材料的项目。这可以用表示不存在很容易表达。

假设您有两个表ProjectsProjectMaterials,一个查询看起来像:

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) 

相关内容

  • 没有找到相关文章

最新更新