优化 JOIN 查询,用于表之间的多个对应关系
Optimize a JOIN query, for multiple correspondances between tables
我正在尝试优化一个函数(MySQL),但是JOIN
仍然没有完全理解(我尝试做一个简单的例子):
我有 2 tables :
Table 项目
ID | ID_ORDER | ID_BOX | NAME
001 | 2564 | 123 | SPOON_1
002 | 2564 | 123 | SPOON_2
006 | 2564 | 123 | SHOES_2
007 | 2564 | 123 | SHOES_1
003 | 2565 | 124 | SPOON_1
004 | 2565 | 124 | SPOON_2
008 | 2565 | 124 | SHOES_1
009 | 2565 | 124 | SHOES_2
005 | 2565 | 125 | SPOON_1
010 | 2565 | 125 | SHOES_1
对象的描述通过 ID_CONTRACT 和 NAME 链接到 ITEM table。(在同一个合同中不可能有 2 个同名的项目)。
Table 说明:
ID_ORDER | NAME_ITEM | LENGTH | WIDTH | ....
2564 | SPOON_1 | 200 | 20 ...
2564 | SPOON_2 | 300 | 20 ...
2564 | SHOES_1 | 500 | 20 ...
2564 | SHOES_2 | 600 | 20 ...
现在,我需要知道合同中的所有项目及其描述,我使用此查询:
SELECT *,description.* FROM items INNER JOIN description
ON (description.ID_CONTRACT=items.ID_CONTRACT AND description.NAME_ITEM=items.NAME)
WHERE ID_CONTRACT= 2564
首先,我刚刚读到它不是正确的查询(我需要在查询中手动复制所有描述字段?),因为 ID_CONTRACT
在两个 table 中,有时它给出我错了(有时不是),我读到 there 不可能忽略重复项。
然后我想知道,当我在 ITEMS table 上创建 select 时,MySQL 正在寻找 DESCRIPTION table 中的每一行对应关系?
有没有办法优化查询(另一种JOIN),所以它不会每次都在ITEMS table中搜索,当他在ITEMS中遇到2个(或更多)具有相同ID_CONTRACT/NAME的元素时?
select *
表示所有 table 中的所有列 select
在你的情况下,这就像 select items.,description. 所以语法 SELECT ,description. 似乎您正在尝试 select 两次 table 描述
的列
由于您在两个 table 中具有相同的列名 ID_CONTRACT
,这会在连接期间对数据库引擎的列名称产生歧义。
为避免这种情况,您只需要在连接列名称中使用完整的参考名称即可,例如:
table1.col1 = table2.col1
这样 db engino 就知道每个 table 必须使用哪个列来连接
SELECT items.*, description.*
FROM items
INNER JOIN description ON description.ID_CONTRACT=items.ID_CONTRACT
AND description.NAME_ITEM=items.NAME
WHERE ID_CONTRACT= 2564
你的问题的第二部分
MySQL is looking for each line a correspondance in DESCRIPTION table?
是的。
关系数据库处理数据集并检索 tables
之间的所有对应关系
如果行确实重复,您可以使用
检索不同的结果
select DISTICNT col1, col2..
通常 select * 来自正确规范化数据集的连接不会产生重复的行(至少你在一列中的值在行之间不同)
但是如果某些列结果对您不重要并且可以从结果中省略,这种情况可能会产生具有重复行的结果并且您可以执行 selective select 仅使用您真正需要的列名并应用 discint 子句
我正在尝试优化一个函数(MySQL),但是JOIN
仍然没有完全理解(我尝试做一个简单的例子):
我有 2 tables :
Table 项目
ID | ID_ORDER | ID_BOX | NAME
001 | 2564 | 123 | SPOON_1
002 | 2564 | 123 | SPOON_2
006 | 2564 | 123 | SHOES_2
007 | 2564 | 123 | SHOES_1
003 | 2565 | 124 | SPOON_1
004 | 2565 | 124 | SPOON_2
008 | 2565 | 124 | SHOES_1
009 | 2565 | 124 | SHOES_2
005 | 2565 | 125 | SPOON_1
010 | 2565 | 125 | SHOES_1
对象的描述通过 ID_CONTRACT 和 NAME 链接到 ITEM table。(在同一个合同中不可能有 2 个同名的项目)。
Table 说明:
ID_ORDER | NAME_ITEM | LENGTH | WIDTH | ....
2564 | SPOON_1 | 200 | 20 ...
2564 | SPOON_2 | 300 | 20 ...
2564 | SHOES_1 | 500 | 20 ...
2564 | SHOES_2 | 600 | 20 ...
现在,我需要知道合同中的所有项目及其描述,我使用此查询:
SELECT *,description.* FROM items INNER JOIN description
ON (description.ID_CONTRACT=items.ID_CONTRACT AND description.NAME_ITEM=items.NAME)
WHERE ID_CONTRACT= 2564
首先,我刚刚读到它不是正确的查询(我需要在查询中手动复制所有描述字段?),因为 ID_CONTRACT
在两个 table 中,有时它给出我错了(有时不是),我读到 there 不可能忽略重复项。
然后我想知道,当我在 ITEMS table 上创建 select 时,MySQL 正在寻找 DESCRIPTION table 中的每一行对应关系?
有没有办法优化查询(另一种JOIN),所以它不会每次都在ITEMS table中搜索,当他在ITEMS中遇到2个(或更多)具有相同ID_CONTRACT/NAME的元素时?
select *
表示所有 table 中的所有列 select
在你的情况下,这就像 select items.,description. 所以语法 SELECT ,description. 似乎您正在尝试 select 两次 table 描述
由于您在两个 table 中具有相同的列名 ID_CONTRACT
,这会在连接期间对数据库引擎的列名称产生歧义。
为避免这种情况,您只需要在连接列名称中使用完整的参考名称即可,例如:
table1.col1 = table2.col1
这样 db engino 就知道每个 table 必须使用哪个列来连接
SELECT items.*, description.*
FROM items
INNER JOIN description ON description.ID_CONTRACT=items.ID_CONTRACT
AND description.NAME_ITEM=items.NAME
WHERE ID_CONTRACT= 2564
你的问题的第二部分
MySQL is looking for each line a correspondance in DESCRIPTION table?
是的。
关系数据库处理数据集并检索 tables
之间的所有对应关系如果行确实重复,您可以使用
检索不同的结果 select DISTICNT col1, col2..
通常 select * 来自正确规范化数据集的连接不会产生重复的行(至少你在一列中的值在行之间不同)
但是如果某些列结果对您不重要并且可以从结果中省略,这种情况可能会产生具有重复行的结果并且您可以执行 selective select 仅使用您真正需要的列名并应用 discint 子句