有INNER JOIN限制 - 第2部分?

时间:2011-01-13 12:39:46

标签: mysql join

我之前询问过关于INNER JOIN和LEFT JOIN的问题,但是在我的查询中仍然没有关于使用INNER JOIN和LEFT JOIN的LIMIT的答案。

情况:每次我需要检索有关安装中使用的材料的信息时,我需要检查11个不同种类的材料表。

安装有一个材料列表,有时安装有时没有,如果完全安装我需要检查十一个可能的材料表,我想使用单个查询,或者更好的单个巨大查询。 / p>

有可能吗?

无论如何,谢谢,只是好奇心。 :)

[EDITED] * 表格结构 *

--
-- Estrutura da tabela `equipment`
--

CREATE TABLE IF NOT EXISTS `equipment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idcontrato` int(11) NOT NULL,
  `idtorre` int(11) NOT NULL,
  `ip` varchar(15) NOT NULL,
  `tipo_equip` int(11) NOT NULL,
  `obs` text NOT NULL,
  `usado_cliente` tinyint(1) NOT NULL COMMENT 'usado no cliente 1=sim 0=nao',
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='equipamentos apenas para router e antenas' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equipment`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_antena`
--

CREATE TABLE IF NOT EXISTS `equip_antena` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idproduto` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_antena`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_antena_cable_rgc213`
--

CREATE TABLE IF NOT EXISTS `equip_antena_cable_rgc213` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idantena` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_antena_cable_rgc213`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_cable_utp`
--

CREATE TABLE IF NOT EXISTS `equip_cable_utp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idantena` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_cable_utp`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_conector`
--

CREATE TABLE IF NOT EXISTS `equip_conector` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idantena` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_conector`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_conector2`
--

CREATE TABLE IF NOT EXISTS `equip_conector2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idantena` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_conector2`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_fonte`
--

CREATE TABLE IF NOT EXISTS `equip_fonte` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idantena` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_fonte`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_pigtail`
--

CREATE TABLE IF NOT EXISTS `equip_pigtail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idproduto` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_pigtail`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_poe`
--

CREATE TABLE IF NOT EXISTS `equip_poe` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idantena` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_poe`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_rj45`
--

CREATE TABLE IF NOT EXISTS `equip_rj45` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idproduto` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_rj45`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_router`
--

CREATE TABLE IF NOT EXISTS `equip_router` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idproduto` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_router`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_suporte`
--

CREATE TABLE IF NOT EXISTS `equip_suporte` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idantena` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_suporte`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `equip_suporte2`
--

CREATE TABLE IF NOT EXISTS `equip_suporte2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod_equip` varchar(25) NOT NULL COMMENT 'codigo para controle de equipamento',
  `unid_medida` enum('metros','unidade','peça','pacote') DEFAULT NULL,
  `qtde` int(11) DEFAULT NULL,
  `idantena` int(11) NOT NULL COMMENT 'id do produto na tbl produtos',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tbl de equipamento instalado no cliente ' AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `equip_suporte2`
--

1 个答案:

答案 0 :(得分:1)

您可以根据需要添加任意数量的连接,据我所知,没有限制。但它可能会变慢,具体取决于它需要搜索的数据量。您可以查看INDEXES以加快不同表之间的数据匹配。

以下是一个例子:

我假设(可能不正确,但对于该示例无关紧要)equipment表是主要设备,并且可能存在与其相关联的其他类型的设备。

INNER或LEFT JOIN之间的选择很简单:如果所有其他表中始终有一个条目,则可以使用INNER。如果可能是一个条目,但不一定是一个条目,则应使用LEFT JOIN。这样您只需从主表(SELECT .. FROM main WHERE ..)中检索某些数据,如果其中一个LEFT JOINed表中存在匹配项,则它们将被添加到主结果中。

SELECT
    e.*
  , ea.id AS antena
  , ecu.id AS cable_utp
FROM equipment e
LEFT JOIN equip_antena ea
  ON ea.cod_equip = e.cod_equip
LEFT JOIN equip_cable_utp ecu
  ON ecu.cod_equip = e.cod_equip
WHERE e.id = 1

这将显示equipment表中id = 1的信息。如果equip_antena条目具有相同的cod_equip id,则将设置“antena”列,否则它将为NULL。同样适用于equip_cable_utp中的可能条目。您也可以为所有其他表格执行此操作。