【问题标题】:how this join statement work to produce this result此连接语句如何产生此结果
【发布时间】:2012-07-09 12:28:33
【问题描述】:

嗨,我正在学习 MySQL 加入。从教程中我得到了两个表。

查询是

<?php
// Make a MySQL Connection
// Construct our join query
$query = "SELECT family.Position, food.Meal ".
 "FROM family, food ".
    "WHERE family.Position = food.Position";

$result = mysql_query($query) or die(mysql_error());


// Print out the contents of each row into a table 
while($row = mysql_fetch_array($result)){
    echo $row['Position']. " - ". $row['Meal'];
    echo "<br />";
}
?>

结果是

*我的问题是,这个选择逻辑是什么。 *如果您从获取family 餐桌位置开始并在食物表中搜索它,我认为结果应该是

Dad|steak
Dad|Tacos
Mom|Salad

但结果不同。搜索的工作方式和结果集的组织方式。请帮助我了解这是如何工作的,在此先感谢您......

【问题讨论】:

  • 使用INNER JOIN 获得所需的输出
  • @diEcho,是的,我知道如何使用内部、左右连接。但问题是,我想知道结果集是如何在内部处理的。是将食物表的位置值与家庭表位置值中的每个位置值进行比较,反之亦然。
  • Sql 是声明性语言 - 你说你想要什么,它会尝试执行最有效的查询。在此实例中,优化器将1:n 关系中的n 表作为主要来源。还要记住 Sql 不保证行的顺序。您需要明确订购它们。
  • 您将受益于采用正确的连接语法。加入和过滤之间的区别将大大简化阅读查询。

标签: php mysql sql join


【解决方案1】:

我会重写这个查询:

SELECT
   family.Position, food.Meal
FROM
   family
   JOIN food USING (Position)

您可以将WHERE 子句用于JOIN 条件——MySQL 会以任何一种方式对其进行优化,但通常首选使用ON/USING 用于JOIN 条件的语法。您也可以在此处使用NATURAL JOIN,但这可能不安全。

至于您的具体问题,我不知道为什么 MySQL 会以一种或另一种方式排序。我唯一能告诉你的是,如果你不指定ORDER BY 子句,你不应该依赖结果的顺序。您应该将订单视为随机的。似乎它是通过Meal 而不是Position 订购的。我不知道为什么会这样,但即使是 那个 也可能不可靠。当订单很重要时,请使用ORDER BY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-28
    • 2020-07-21
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多