我有两个表,“库存”和“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>';
}
}
}
}
答案 0 :(得分:2)
我认为问题在于:
$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扩展名is now deprecated and will be removed sometime in the future。那是因为它古老,充满了不良做法,缺乏一些现代特色。不要用它来编写新代码。请改用PDO或mysqli_*。
<强>更新强>
这相当于你在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>';
}
}
答案 1 :(得分:0)
假设inventory.type
列为not null
(请确认),则不需要LEFT JOIN
。 INNER JOIN
可以解决问题。
由于您只需要一个关联数组,请考虑使用mysql_fetch_assoc()
而不是mysql_fetch_array()
,或指定MYSQL_ASSOC
作为第二个参数。
此外,请考虑完全移植到mysqli
或PDO
(请参阅其他人的回复)。
返回的关联数组的键是普通字段名,没有表名部分。
最后,对于你的问题,是的,inventory
将是左表,其所有记录都参与结果,无论inventory_type
表中是否有相应的记录。 / p>