我有一个问题:
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] => [display] => 1 [删除] => 0 [desc_id] => [desc] => [text] => )
为什么在查询完全相同时会有不同的结果?
编辑: 我的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;
}
答案 0 :(得分:2)
我认为你不能使用select *(也因为两个表中的列名相同),但是根据需要选择完全相应的字段
select table_name.field, table_name.field2, other_table_name.field1
..你可以从php代码和phpmyadmin获得正确的结果
答案 1 :(得分:1)
我认为这是因为'cat_id'在两个表中都是相同的字段名称=&gt;结果数组中的索引相同。 尝试修改查询,如:“从categoriesys中选择categoriesys.cat_id AS类别......”
答案 2 :(得分:1)
您正在从categorys
和category_info
中选择*。它们都有一个cat_id
列。因此,您将获得两个cat_id
列。
问题是:当您在SELECT列表中遇到两个具有相同名称的列时,您正在使用的SQL库/驱动程序是做什么的?
看起来它可能会覆盖第二个遇到的第一个......如果你使用明确的SELECT列表,指定categorys.cat_id
而不引入{{}会发生什么? 1}}?
答案 3 :(得分:0)
当你陈述
时当我在phpMyAdmin中运行时,我得到了一个cat_id
你的意思是你为cat_id获得了一个VALUE,或者你是否为NULL?因为这是你用php得到的,cat_id的NULL值(正如你在print_r中看到的那样,它仍然出现在那里)。
如果您不希望从categorys
获取该类别category_info
中没有现有行的行,那么您必须使用RIGHT JOIN而不是LEFT JOIN。