优化 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 子句