Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用';table.column=t.column';(当t是table的缩写时)_Mysql_Sql - Fatal编程技术网

Mysql 如何使用';table.column=t.column';(当t是table的缩写时)

Mysql 如何使用';table.column=t.column';(当t是table的缩写时),mysql,sql,Mysql,Sql,底部的代码有效,这让我很困惑。我不明白这个表达: where wands_property.age = p.age 因为p是wands\u属性的缩写,所以该表达式看起来像: wands_property.age = wands_property.age 这是重言式 当给表赋予别名p时,wands\u属性有何不同 代码: 表别名p(它是外部查询中的一个表)和表名wands\u属性(它是子查询中的一个表)表示对同一物理表的不同传递,因此表达式可能会比较其中不同行的列值 这与引用具有完全相同的架构

底部的代码有效,这让我很困惑。我不明白这个表达:

where wands_property.age = p.age
因为
p
wands\u属性的缩写,所以该表达式看起来像:

wands_property.age = wands_property.age
这是重言式

当给表赋予别名
p
时,
wands\u属性
有何不同

代码:


表别名
p
(它是外部查询中的一个表)和表名
wands\u属性
(它是子查询中的一个表)表示对同一物理表的不同传递,因此表达式可能会比较其中不同行的列值


这与引用具有完全相同的架构和数据的完全不同的表完全相同。

我们为所有表引用指定了唯一的别名,并用这些别名限定了所有列引用,这将减少混淆

这里为相关子查询内的表引用添加别名
mp
mw

SELECT w.id
     , p.age
     , w.coins_needed
     , w.power 
  FROM wands w 
  JOIN wands_property p 
    ON p.code = w.code 
 WHERE p.is_evil = 0
   AND w.coins_needed = 
       (
         SELECT MIN(mw.coins_needed)
           FROM wands mw  
           JOIN wands_property mp 
             ON mw.code  = mp.code 
          WHERE mp.age   = p.age
            AND mw.power = w.power
       )
ORDER
   BY w.power DESC
    , p.age DESC
请注意,子查询(在参数内部)中的引用
p.age
w.power
是对参数外部表的引用。和
mw.
mp.
是对参数内表格的引用

原始查询很好,没有别名,因为(对于MySQL)引用的表并不含糊。我们遵循的模式是为所有表引用提供唯一别名,并限定所有列引用,以帮助读者(并避免在向表中添加新列时引入“不明确的列”错误)


如果这还不能消除混淆,那么我们需要了解相关子查询是如何工作的

对于外部查询处理的每一行,MySQL(实际上)在参数内运行查询,将
p.age
w.power
的值代入,从外部查询的当前行中获取这些值

假设外部查询正在处理一行,其中p.age的值为7,w.power的值为42

子查询是有效的

         SELECT MIN(mw.coins_needed)
           FROM wands mw  
           JOIN wands_property mp 
             ON mw.code  = mp.code 
          WHERE mp.age   = 7
            AND mw.power = 42

我们称之为相关子查询,因为子查询中的
p.age
w.power
引用的是外部查询中正在处理的行。也就是说,子查询与外部查询正在处理的当前行相关。

谢谢您的回答,但我不明白,您能解释一下吗?不同的过程是什么意思?为什么它所比较的行在每种情况下都会不同?请你用一个真实的例子,比如我问题中的例子,还是你自己的表格?比如,在上面的代码中,子查询的这一部分发生了什么?谢谢。@tom当一个表再次出现在查询中时,它将被重新访问,并被认为是查询中完全不同的表。这在查询中经常发生。我解释得不太清楚。考虑如何从第一个字母相同的用户表返回所有名称组合。自己编写查询,完成后您将理解这个概念。查找子查询,然后查找相关子查询。谢谢Spencer,示例非常清楚地说明了这一点。顺便说一句,这是否意味着如果不首先使用别名,这种查询是不可能的?我这样说是因为如果你不使用别名,它将是“wands.power=wands.power”。是的。如果对
wands
表的引用之一没有别名,则无法进行原始查询。如果没有别名,则无法在子查询中引用
wands
表,也无法在外部查询中引用
wands
表。子查询中的“
wands.power=wands.power
”条件将仅引用子查询中的表。将该条件等效于“
wands.power不为NULL”
”。我遵循的模式是为每个表引用指定唯一的别名,并使用表别名限定所有列引用。
         SELECT MIN(mw.coins_needed)
           FROM wands mw  
           JOIN wands_property mp 
             ON mw.code  = mp.code 
          WHERE mp.age   = 7
            AND mw.power = 42