sql选择问题

sql选择问题,sql,select,Sql,Select,我有4张桌子 文章 机器 特征 所需功能 问题是,产品可以在机器上生产,但只能在具有产品所需功能的机器上生产。 产品可能需要0个或更多功能,而机器可能需要0个或更多功能 我想创建一个查询,显示有效的文章-机器组合的完整概述。 问题是:我该怎么做 下面是MySQL的示例数据集。它将导致以下查询结果: "car";"virtual machine" "boat";"virtual machine" "boat";"lean machine" 以下是数据集: CREATE TABLE IF NO

我有4张桌子

  • 文章
  • 机器
  • 特征
  • 所需功能
问题是,产品可以在机器上生产,但只能在具有产品所需功能的机器上生产。 产品可能需要0个或更多功能,而机器可能需要0个或更多功能

我想创建一个查询,显示有效的文章-机器组合的完整概述。 问题是:我该怎么做

下面是MySQL的示例数据集。它将导致以下查询结果:

"car";"virtual machine"
"boat";"virtual machine"
"boat";"lean machine"
以下是数据集:

CREATE TABLE IF NOT EXISTS `articles` (
  `name` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `articles` (`name`) VALUES
('car'),
('boat');

CREATE TABLE IF NOT EXISTS `features` (
  `machine` text NOT NULL,
  `feature_name` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `features` (`machine`, `feature_name`) VALUES
('lean machine', 'punch'),
('virtual machine', 'punch'),
('virtual machine', 'drill');

CREATE TABLE IF NOT EXISTS `machines` (
  `name` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `machines` (`name`) VALUES
('lean machine'),
('virtual machine');

CREATE TABLE IF NOT EXISTS `required_features` (
  `article` text NOT NULL,
  `feature` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `required_features` (`article`, `feature`) VALUES
('car', 'drill'),
('boat', 'punch');

这只是几个连接

SELECT DISTINCT a.article, f.machine
FROM articles AS a
INNER JOIN required_features AS rf
    ON rf.article = a.article
INNER JOIN features AS f
    on f.feature_name = rf.feature
这将为您提供所有通过这些表相关的文章和机器的有效组合。您可以使用一个
JOIN
,这可能是因为此查询不需要
articles
表-只需从
required\u features
表中选择
article
,然后连接到
features


如果您需要更多信息,可以将最后一个连接更改为
左连接
,并且
f.machine
NULL
值将告诉您当前无法生成文章。

使用您提供的数据,解决方案只是几个连接——但我假设一篇文章可能需要不止一个功能,一台机器可能拥有其中一个功能,但不是所有需要的功能

select *
from articles ar
join required_features rf on rf.article=ar.name
join features f on f.feature_name=rf.feature
join machines m on m.name=f.machine
在这种情况下,您还需要确保具有文章匹配功能的机器也不缺少文章所需的任何其他功能。我不认为左连接可以完成这项工作,因为它会返回匹配特性的机器,而返回非匹配特性的null。。。然而,在这种情况下,它根本不应该返回机器

SELECT DISTINCT
    a.name,
    m.name
FROM
    articles a INNER JOIN
    required_features rf ON rf.article = a.name INNER JOIN
    features f ON f.feature_name = rf.feature INNER JOIN
    machines m 
        ON m.name = f.machine
        -- Make sure that there is no feature required that isn't provided by the machine.
        AND NOT EXISTS (
            SELECT 1
            FROM 
                machines m2 INNER JOIN
                features f2 ON f2.machine = m2.name LEFT JOIN
                required_features rf2 ON rf2.feature = f2.feature_name
            WHERE 
                m2.name = m.name AND
                rf2.feature IS NULL
                AND rf2.article = a.name
        )

SELECT*
将返回比OPI中请求的字段多得多的字段,但我无法验证答案,因为查询包含两个错误。一个我还不能解决的问题;a、 名字不是known@Michael; 第16行的a.name是未知列。我猜那是因为a在外部查询中。我应该如何更改查询?看起来您是通过将a.name移动到where子句来解决的。。。谢谢你解决了这个问题。。。