0

次のようなクエリがあります。

SELECT p.prodname, p.prodcode, o.vovalue, p.productid, i.imageprodid, c.vcstock, p.prodcatids, t.catname
FROM isc_products p
LEFT OUTER JOIN isc_product_variation_combinations c ON c.vcproductid = p.productid
LEFT OUTER JOIN isc_product_variations v ON v.variationid = c.vcvariationid
LEFT OUTER JOIN isc_product_variation_options o ON o.voptionid = c.vcoptionids
LEFT OUTER JOIN isc_product_images i ON i.imageprodid = p.productid
LEFT OUTER JOIN isc_categories t ON t.categoryid = p.prodcatids
WHERE c.vcstock >1
AND  i.imageprodid IS NULL
ORDER BY ca.catname

列のカテゴリ名 (t.catname) を取得しようとしています。t.categoryid = p.prodcatids の Join のため、NULL 値を返しています。

p.prodcatids はテキスト (utf8_general) で、t.categoryid は int(11) です。

p.prodcatids を int11 として変換 (キャスト) して、t.categoryid に結合するにはどうすればよいですか?

4

3 に答える 3

2

いくつかのメモ。

キャストを実行して目的の結果を得ることができるという事実は、適切なデータ構造を持つことに代わるものではありません。すべての外部キーを主キーと同じタイプにする必要があります。特に、これはクエリ オプティマイザーに大損害を与え、通常、ネストされたループ結合 (最も効率の悪い種類) を保証します。

また、このような状況が発生した場合は、通常、文字データ型から変換する方が正確です。これは、キャスト関数が他のフィールドと完全に一致しない可能性があるためです。たとえば、「100」は「100.00」と等しくありません。

ただし、これにより、キャストに失敗する可能性が生じます。SQL Server などの一部のデータベースでは、この状況を処理するために isnumeric や isdate などの関数が提供されています。他の人はしません。

于 2012-06-04T02:08:45.150 に答える
2
CAST(p.prodcatids AS UNSIGNED)

仕事をするべきです

于 2012-06-04T00:58:19.857 に答える
1

これが mysql にある場合 - convert 関数と cast 関数を確認しましたか? http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast

于 2012-06-04T00:57:46.953 に答える