【问题标题】:Using Joins to query two tables使用 Joins 查询两个表
【发布时间】:2013-10-06 02:50:09
【问题描述】:

我有两个表,“inventory”和“inventory_type”。 “inventory”表存储它的名称和类型,“inventory_type”表存储RAM、CPU等类型名称和排序顺序。我以前从未使用过 JOINS,也不确定要使用哪种类型,但它们似乎都不适用于以下代码。

作为一个附带问题,使用下面的代码,“inventory”是左表还是将“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>';
            }
        }
    }
}

【问题讨论】:

  • “它们似乎都不起作用”是什么意思?查询看起来不错,您需要发布数据样本。
  • 在 $result = mysqli_query($query,$db) 之后使用 print_r($result) 来调试数据集
  • 是 $id = $row["inventory.id"];获得价值的正确方法?我做了一个 var_dump() 并且它似乎确实在返回数据,只是似乎我没有正确获取它

标签: php mysql sql join


【解决方案1】:

我认为问题出在这里:

$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>';
        }
} 

【讨论】:

    【解决方案2】:

    假设inventory.type 列是not null(请确认),则不需要LEFT JOININNER JOIN 可以解决问题。

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

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

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

    最后,对于您的附带问题,是的,inventory 将是左表,无论inventory_type 表中是否有相应的记录,它的所有记录都参与结果。

    【讨论】:

      猜你喜欢
      • 2012-11-23
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      相关资源
      最近更新 更多