【问题标题】:Optimize a JOIN query, for multiple correspondances between tables针对表之间的多个对应关系优化 JOIN 查询
【发布时间】:2022-01-20 20:52:31
【问题描述】:

我正在尝试优化一个函数(MySQL),但是JOIN仍然没有完全理解(我尝试做一个简单的例子):

我有 2 张桌子:

表项

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 表。(同一合同中不可能有两个同名的项目)。

表格描述:

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 在两个表中,有时它会给我错误(有时不是),我阅读there,不可能忽略重复项。 然后我想知道,当我在ITEMS 表上进行选择时,MySQL 是否正在为DESCRIPTION 表中的每一行寻找对应关系? 有没有办法优化查询(另一种JOIN),所以它不会每次都在ITEMS表中搜索,当他在ITEMS中遇到2个(或更多)元素时,具有相同的ID_CONTRACT/NAME?

【问题讨论】:

    标签: sql join


    【解决方案1】:

    select * 表示从所有表中选择所有列 在你的情况下,这就像选择项目。,description. 所以使用语法 SELECT ,description. 似乎你试图选择两次表描述的列 p>

    由于您在两个表中都有相同的列名ID_CONTRACT,这会在连接期间对数据库引擎的名称产生歧义。 为避免这种情况,您只需要在连接列名称中使用完整的参考名称,例如:

    table1.col1 = table2.col1 
    

    这样 db engino 就知道每个表必须使用哪一列进行连接

    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?
    

    是的。

    关系数据库处理数据集并检索表之间的所有对应关系

    如果确实重复了行,您可以使用

    检索不同的结果
     select DISTICNT col1, col2..
    

    通常,从正确规范化数据集的连接中选择 * 不会产生重复的行(至少您在一列中的值在行之间不同)

    但是如果某些列结果对您不重要并且可以从结果中省略,这种情况可能会产生重复行的结果,您可以仅使用您真正需要的列名执行选择性选择并应用 distint 子句

    【讨论】:

    • 感谢您的解释。事实上,重复的不是来自 ID_CONTRACT(读了你就明白了),而是两个表中都存在一些字段,如“LENGTH”。所以我想我会从第一个表中删除这些字段(这是描述的一部分)(我知道这是不正确的,但我在创建它们时不知道 JOIN,这就是我现在要纠正的)。
    • 然后关于DISTINCT,我想我没有解释正确:我的物品“SPOON_1”可以放在几个盒子里(有时可以放上百次),所以对于每个元素SPOON_1找到,它会寻找它的描述吗?还是 SQL 会看到在我的项目列表中,我有 100 个具有相同 ID_CONTRACT 和 NAME 的项目,所以只会查找一次描述,然后将其应用于每个 SPOON_1?
    • 对于这个细节,你应该发布一个带有适当数据样本的特定问题,并将预期结果作为表格文本..(我不在你的数据库中,一个样本对我有很大帮助。)一旦完成给我评论新问题的链接..
    • 好的,谢谢,这是链接:stackoverflow.com/questions/70402148/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2016-02-13
    相关资源
    最近更新 更多