使用连接查询两个表

时间:2013-09-30 09:32:42

标签: php mysql sql join

我有两个表,“库存”和“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>';
            }
        }
    }
}

2 个答案:

答案 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。那是因为它古老,充满了不良做法,缺乏一些现代特色。不要用它来编写新代码。请改用PDOmysqli_*

<强>更新

这相当于你在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 JOININNER JOIN可以解决问题。

由于您只需要一个关联数组,请考虑使用mysql_fetch_assoc()而不是mysql_fetch_array(),或指定MYSQL_ASSOC作为第二个参数。

此外,请考虑完全移植到mysqliPDO(请参阅其他人的回复)。

返回的关联数组的键是普通字段名,没有表名部​​分。

最后,对于你的问题,是的,inventory将是左表,其所有记录都参与结果,无论inventory_type表中是否有相应的记录。 / p>