[英]Using Joins to query two tables
我有兩個表,“庫存”和“inventory_type”。 “inventory”表存儲它的名稱和類型,“inventory_type”表存儲類型名稱,如RAM,CPU等,以及排序順序。 我之前從未使用過JOINS,我不確定使用哪種類型,但它們似乎都不適用於以下代碼。
作為一個附帶問題,使用下面的代碼,“庫存”是左表還是“inventory_type”會在左邊加入?
function getInventoryOptions($db, $default_value, $datacenter)
{
$query = "SELECT inventory.id, inventory.name, inventory_type.short_name
FROM inventory LEFT JOIN inventory_type
ON inventory.type = inventory_type.id WHERE inventory.datacenter = " . $datacenter . " ORDER BY inventory_type.sort_order ASC";
$result = mysql_query($query, $db);
echo '<option value="">None</option>';
if ($result)
{
while($row = mysql_fetch_array($result))
{
$id = $row["inventory.id"];
$name = $row["inventory.name"];
$type = $row["inventory_type.short_name"];
if ($default_value == $id)
{
echo '<option selected value="' . $id . '">' . $type . ": " . $name . '</option>';
}
else
{
echo '<option value="' . $id . '">' . $type . ": " . $name . '</option>';
}
}
}
}
我認為問題出在這里:
$id = $row["inventory.id"];
$name = $row["inventory.name"];
$type = $row["inventory_type.short_name"];
嘗試:
$id = $row['id'];
$name = $row['name'];
$type = $row['short_name'];
*請注意,mysql擴展現在已棄用 ,將來某個時候將被刪除 。 那是因為它古老,充滿了不良做法,缺乏一些現代特色。 不要用它來編寫新代碼。 請改用PDO或mysqli_ * 。
UPDATE
這相當於你在mysqli中的函數:
function getInventoryOptions($db, $default_value, $datacenter)
{
$query = "SELECT inventory.id, inventory.name, inventory_type.short_name
FROM inventory LEFT JOIN inventory_type
ON inventory.type = inventory_type.id WHERE inventory.datacenter = " . $datacenter . " ORDER BY inventory_type.sort_order ASC";
$link = mysqli_connect("[your_host]","[your_user]","[password]","[database]") or die("Error " . mysqli_error($link));
//execute the query.
$result = $link->query($query);
//display information:
while($row = mysqli_fecth_array($result)) {
$id = $row['id'];
$name = $row['name'];
$type = $row['short_name'];
if ($default_value == $id)
{
echo '<option selected value="' . $id . '">' . $type . ": " . $name . '</option>';
}
else
{
echo '<option value="' . $id . '">' . $type . ": " . $name . '</option>';
}
}
假設inventory.type
列not null
(請確認),則不需要LEFT JOIN
。 INNER JOIN
將成功。
由於您只需要一個關聯數組,請考慮使用mysql_fetch_assoc()
而不是mysql_fetch_array()
,或者將MYSQL_ASSOC
指定為第二個參數。
此外,考慮完全移植到mysqli
或PDO
(參見其他人的回復)。
返回的關聯數組的鍵是普通字段名稱,沒有表名部分。
最后,對於您的問題,是的, inventory
將是左表,其所有記錄都參與結果,無論inventory_type
表中是否有相應的記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.