【问题标题】:MySQL join results different in PHP?PHP中的MySQL连接结果不同?
【发布时间】:2011-11-15 11:18:06
【问题描述】:

我有一个问题:

SELECT * FROM categorys 
LEFT JOIN category_info ON categorys.cat_id=category_info.cat_id 
WHERE `cat_name` = 'aname'
ORDER BY `cat_order`

当我在 phpMyAdmin 中运行它时,无论第二个表中是否存在匹配项,我都会返回一个 cat_id。

但是,当我在我的 PHP 代码中运行此查询时,我得到一个空白的 cat_id,如 print_r() 所示:

数组 ( [cat_id] => [cat_name] => 浴室 [type] => main [cat_order] => 99 [cat_img] => [显示] => 1 [已删除] => 0 [desc_id] => [desc] => [文本] => )

当查询完全一样时,为什么会有不同的结果?

编辑: 我的 PHP 代码:

$getcatidsql = "SELECT * FROM categorys 
LEFT JOIN category_info ON categorys.cat_id=category_info.cat_id 
WHERE `cat_name` = '{$cname}'
ORDER BY `cat_order";   
$getcatidresult = $db->query( $getcatidsql );
$catdata = $db->fetchRow( $getcatidresult );

function query() {
  $this->query_total++;
  if (func_num_args() == 1) {
    $sql = func_get_arg(0);
  } else {
    $args = func_get_args();
    for ($i=1;$i<count($args);$i++) if (!is_numeric($args[$i])) $args[$i] = '"'.mysql_real_escape_string($args[$i]).'"';
    $sql = vsprintf(array_shift($args),$args);
  }
  if ($result = mysql_query($sql,$this->db_connection)) {
    return $result;
  } else {
    $this->dberror( $this->db_connection, $sql );
  }
}

function fetchRow($result,$type=MYSQL_ASSOC)
{
    if($result)
        $row = mysql_fetch_array($result,$type);
    return $row;
}

【问题讨论】:

  • 也许您使用不同的数据库?显示你的 php 代码
  • 不是同一个数据库。我对为什么 PHP 中的查询出错感到困惑,所以我使用 phpMyAdmin 来调试它。就在那时,我看到查询按预期工作。
  • 仅供参考,category 的复数形式是 categories,而不是 categorys
  • 我唯一的猜测是,因为数据不存在,LEFT JOIN 为 category_info(表 2)中的所有行设置了 NULL,所以 category_info.cat_id 的 NULL 可能正在替换类别中的内容。 cat_id?
  • 是的:您正在从 categoryscategory_info 中选择 *。他们都有一个cat_id 列。所以你会得到两个cat_id 列。问题是:当您使用的 SQL 库/驱动程序在 SELECT 列表中遇到两个具有相同名称的列时,它会做什么?看起来它可能会用第二个覆盖它遇到的第一个......如果您使用显式 SELECT 列表,指定 categorys.cat_id 并且 not 引入 category_info.cat_id 会发生什么?

标签: php mysql database join phpmyadmin


【解决方案1】:

当你声明时

当我在 phpMyAdmin 中运行它时,我会返回一个 cat_id

您的意思是您获得了 cat_id 的 VALUE 还是您将其设为 NULL?因为这就是你用 php 得到的,cat_id 的 NULL 值(正如你在 print_r 中看到的,它仍然出现在那里)。

如果您不想从categorys 获取行,而category_info 中没有该类别的现有行,那么您必须使用 RIGHT JOIN 而不是 LEFT JOIN。

【讨论】:

  • 不,我在 phpMyAdmin 中得到了一个有效的 ID 而不是 NULL。
【解决方案2】:

我认为你不能使用 select * (也是因为两个表中的列名相同),而是根据你的需要准确选择字段

  select table_name.field, table_name.field2, other_table_name.field1 

.. 你会从 php 代码和 phpmyadmin 中得到正确的结果

【讨论】:

    【解决方案3】:

    我认为这是因为 'cat_id' 是两个表中的相同字段名称 => 结果数组中的相同索引。 尝试修改查询,如:“Select categories.cat_id AS category from categories .....”

    【讨论】:

      【解决方案4】:

      您正在从 categoryscategory_info 中选择 *。他们都有一个cat_id 列。所以你会得到两个cat_id 列。

      问题是:当您使用的 SQL 库/驱动程序在您的 SELECT 列表中遇到两个具有相同名称的列时,它会做什么?

      看起来它可能会用第二个覆盖它遇到的第一个...如果您使用显式 SELECT 列表,指定 categorys.cat_id 并且 引入 category_info.cat_id,会发生什么?

      【讨论】:

      • 谢谢,这是对的,但有人先回答。不过感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      相关资源
      最近更新 更多