gpt4 book ai didi

mysql - 5 个表,首先扫描以在第一个关系对或第二个关系对中查找单个匹配,无需全表扫描

转载 作者:行者123 更新时间:2023-11-29 07:21:13 25 4
gpt4 key购买 nike

我仍在学习 mysql,甚至不知道如何表达它以在搜索中找到答案。

我有5个表(实际上更多,但对于示例来说,5个就足够了),一个是主表T,然后我们有T1和T2以及它们各自的关系表T1_x_T和T2_x_T。我需要遍历 T 中的每一行来查找 T1 或 T2 中是否存在具有给定属性的匹配项,它只需要匹配一次,但可以有多个匹配项。表结构类似于:

T.id
T1.id T1.attrib
T2.id T2.attrib
T1_x_T.T1_id, T1_x_T.T_id
T2_x_T.T2_id, T2_x_T.T_id

如果 T 中的条目与该属性上的 T1 或 T2 匹配,如下所示:

 (T.id = T1_x_T.T_id and T1.id = T1_x_T.T1_id and T1.attrib = SOMEVAL) or (T.id = T2_x_T.T_id and T2.id = T2_x_T.T2_id and T2.attrib = SOMEVAL)

即,一旦找到 T 的匹配项,就移至 T 中的下一行,并且不扫描表的其余部分,也不移至下一个表。基本上要回答这个问题:“对于 T 中的每个 id,T1_x_T 或 T2_x_T 中是否有任何匹配项,其中相应的 T1 或 T2 值与 attrib 的给定值匹配?”

因此结果将是表 T 的子集。

我最初的直觉是使用LEFT INNER JOINLIMITGROUP BY来实现这一点,但我对此了解不够要么(或mysql)知道如何实现这一点或者它是否可以实现。我确实知道如何以我认为低效的方式(对两者进行全表扫描?)或在两个查询中执行此操作,然后在 mysql 之外解析结果,但我想学习如何构建高效的查询。 p><小时/>

根据要求,用于查询 attrib = 1 的示例数据:

T.id:
i1
i2
i3

T1.id - T1.attrib:
a - 1
b - 0

T1_x_T.T1_id - T1_x_T.T_id:
a - i1
b - i1
b - i2


T2.id - T2.attrib:
y - 0
z - 1

T2_x_T.T2_id - T2_x_T.T_id:
z - i3
y - i2

结果:

i1
i3

由于 T1.id = a 具有 T1.attrib = 1 且 T1_x_T.T1_id = a 具有 T1_x_T.T_id = i1 的条目;并且 T2.id = z 具有 T2.attrib = 1 且 T2_x_T.T2_id = a 具有 T2_x_T.T_id = i3 的条目。

希望能帮助解释一下。

最佳答案

试试这个:

SELECT 
T.id as T_id
FROM T
LEFT JOIN T1_x_T ON T.id= T1_x_T.T_id
LEFT JOIN T1 ON T1.id = T1_x_T.T1_id
LEFT JOIN T2_x_T ON T.id= T2_x_T.T_id
LEFT JOIN T2 ON T2.id = T2_x_T.T2_id
WHERE T1.attributes = '1' OR T2.attribute = '1';

这映射了你的问题:

"For each id in T, is there any match in T1_x_T or T2_x_T where the corresponding T1 or T2 value matches a given value for attrib?"

并在示例中提供您的预期结果。

只是为了澄清事情是如何运作的。

LEFT JOINS 组合 ON 子句后面的所有行,例如 T.id = T1_x_T.T_id。如果连接在 T1_x_T 中找到 n 个不同的 T 并在 T1_x_T 中找到 m 个不同的记录,并且遵守 ON 子句,它将产生一个包含所有可能值的 m x n 结果。

所以这是您案例中联接的结果:

enter image description here

你看到的NULL就是短路的意思,没有匹配,所以没有结果。

当您放置 WHERE 或 GROUP BY 时,您正在对 JOIN 的扩展表结果进行操作以放置您的条件。

顺便说一句,当您尝试复杂的连接时,最好查看完整的结果,以便更好地了解您是否做得正确,并选择适当的条件来获得所需的结果。

问候

关于mysql - 5 个表,首先扫描以在第一个关系对或第二个关系对中查找单个匹配,无需全表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36098867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com