2012-07-09 35 views
1

嗨,我正在学习MySQL加入。从教程我有两个表。这个加入声明如何工作以产生此结果

enter image description here

查询是

<?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 />"; 
} 
?> 

,其结果是

enter image description here

*我的问题是,这是什么选择逻辑。 *如果您通过获取family表中的位置和搜索它在食台上开始了,我想结果应该是

Dad|steak 
Dad|Tacos 
Mom|Salad 

但结果是不同的。搜索的工作原理和结果集是如何组织的。请帮我理解它是如何工作的,谢谢你提前...............

+0

使用'INNER JOIN'获得所需的输出 – diEcho 2012-07-09 12:33:15

+0

@diEcho,是的,我知道如何使用inner,left和right join。但事情是,我想知道如何在内部处理结果集。食物表的位置值与家庭表位置值中的每个位置值进行比较,反之亦然。 – 2012-07-09 12:42:22

+3

Sql是声明性语言 - 你说你想要什么,它会尝试执行最有效的查询。在这个例子中,优化器把'1:n'关系中的'n'表作为主要来源。请记住,Sql不保证行的顺序。你需要明确地命令它们。 – 2012-07-09 12:42:47

回答

0

我会重写此查询:

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