2012-07-09 34 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