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 *。次に、同じ名前の 2 つの列に異なるエイリアスが必要であることは論理的になります。

于 2013-02-09T09:39:34.950 に答える