2

我有这个 sql 查询:

SELECT * 
FROM products p, products_description pd, products_to_categories c left 
     join  products_sex ps on (c.products_id = ps.products_id), 
     categories cc 
WHERE p.products_id = pd.products_id 
      and p.products_id = c.products_id 
      and cc.categories_id = c.categories_id 
      and p.products_status = 1 
      and p.products_price >= 15.8333333333 
      and p.products_price <= 40 
      and p.products_quantity > 0 
      and (ps.products_sex = "U" or ps.products_sex is null) 
      and (c.categories_id = 77 or cc.parent_id = 77) 
ORDER BY products_sort_order, p.products_date_added desc, pd.products_name ASC 
LIMIT 0, 40

如果我在 MySQL 客户端(命令行或 Navicat)执行它,我会得到以下结果:

products_id  |  dodavatelia_id  ...
2153         |  67              ...

但是,如果我通过 PHP 脚本(使用 mysql_query 和 mysql_fetch_assoc)获取产品,我会得到:

array ( 
    'products_id' => NULL,  
    'dodavatelia_id' => '67', 
    ...
);

为什么我的 products_id 为 NULL?

4

1 回答 1

2

这可能是因为您要连接多个包含具有相同名称的列的表,products_id因此您在此处检索具有此名称的最后一列的值,该名称可能是NULL.

您应该为要检索的列设置别名:

SELECT p.products_id AS pPropId, p.* FROM products p, ...

然后在您的 PHP 结果中,您可以像这样访问您的列:

$result['pPropId']

有关 SQL 别名功能的更多信息,请点击此处

编辑:为什么它在命令行中工作而不是在这里?

SQL 查询工作正常,将返回name 的每一products_id。问题是您使用mysql_fetch_assoc()它根据您的结果返回一个关联数组。而且你不能为数组中的同一个键有多个值。

因此,它可能在内部进行设置$result['products_id'] = p.products_id,但随后它对具有相同名称的下一列执行相同的操作以擦除先前的值。您可以使用没有此问题的mysql_fetch_row() 。

一个好的做法是在 SELECT 中列出您真正想要检索的列,而不仅仅是SELECT *. 然后,具有相同名称的两个列需要不同的别名就变得合乎逻辑了。

于 2013-02-09T09:39:34.950 回答