sql选择问题

时间:2011-07-06 17:17:01

标签: sql select

我有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');

3 个答案:

答案 0 :(得分:2)

这只是几个连接。

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 - 只需从article表中选择required_features并加入features即可。

如果您想要更多信息,可以将上次加入更改为LEFT JOINNULL的{​​{1}}值会告诉您目前无法生成该文章。

答案 1 :(得分:1)

使用您提供的数据,解决方案只是几个连接 - 但我假设一篇文章可能需要多个功能,并且一台机器可能具有这些功能之一,但不是全部需要的功能。

在这种情况下,您还需要确保具有文章匹配功能的计算机也不缺少文章所需的任何其他功能。我不认为左连接会完成这项工作,因为它会返回机器以获得匹配功能,而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
        )

答案 2 :(得分:0)

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