2012-04-06 3 views
1

アフィリエイトプログラムのデータフィードスクリプトを作成していて、本当に "やっている"と思っていましたが、スクリプトを実行すると、28の製品のうち7つでCSVファイルが作成されます。テストに先立って、私はすべての製品をクエリの条件を満たすようにして、すべてを含める必要がありました。在庫レベルと価格条件も削除しました。それでも28のうち7つだけが、1つのカテゴリからcsvファイル5に追加され、2つのカテゴリから追加されます。最初のカテゴリにはわずか5つの製品しかなく、すべてが返されます。しかし、2番目のカテゴリーの23のうちの2つだけが返されます。私のMySQL Queryが28レコードのうち7レコードしか返さないのはなぜですか?

ゴールは、クエリ内のカテゴリからすべての製品の特定のデータを取得し、それらをcsvファイルにダンプすることです。

これは私の初めての(初心者のための)より複雑なSQLクエリを書くことを試みることです。

print_rを使用して、私の問題が私のクエリであることがわかりました。私はこれが以前に働いていたと思った。それが今働いていた時と今の時の違いは、categoryidとcatparentidをつかむことです。しかし、これらの追加を削除しても、私はまだ同じ結果を得ています。今私は、それが以前の私のより大きいデータベースのデータベース上で動作していると思っていたかもしれないと思っていますが、おそらく実際にはすべての製品を返すわけではありませんでした。

完全なスクリプトはかなり長いですが、クエリがすべてのレコードを取得しているかどうかを確認するために新しいスクリプトを作成しました...そうではありません。 :(

私が関連付けられていない製品(なしカテゴリの関連付けを持たない、すなわちもの)をチェックするためのクエリを実行する場合は、すべての製品は、カテゴリに関連付けされている。

製品のすべての画像&ブランドの関連性を持っているIドンそう「がtはそれがいずれかの問題だと思う

を、私は完全にWhere句を削除しても、唯一の7つの製品が手にしている私は、データベース内で直接クエリを実行し、同じことだ

:。。

Showing rows 0 - 6 (7 total, Query took 0.0029 sec) 

SELECT isc_products.productid, isc_products.prodcode, isc_products.prodname, isc_products.produrl, isc_products.prodcalculatedprice, isc_products.proddesc, isc_products.prodcurrentinv, isc_products.upc, isc_categories.categoryid, isc_categories.catparentid, isc_categories.catname, isc_product_images.imagefilestd, isc_product_images.imagefilethumb, isc_brands.brandname 
FROM isc_products 
INNER JOIN isc_categories ON isc_products.prodcatids = isc_categories.categoryid 
INNER JOIN isc_product_images ON isc_products.productid = isc_product_images.imageprodid 
INNER JOIN isc_brands ON isc_products.prodbrandid = isc_brands.brandid 
WHERE isc_categories.categoryid =10 
OR isc_categories.categoryid =12 

この問題の原因となる特殊文字がデータに存在する可能性がありますか?

内部結合を誤って使用していますか?

<pre> 
<?php 

// Make a MySQL Connection 
mysql_connect("localhost", "myusername", "mypassword") or die(mysql_error()); 
mysql_select_db("mydatabase") or die(mysql_error()); 


$result = mysql_query("SELECT isc_products.productid, 
isc_products.prodcode, 
isc_products.prodname, 
isc_products.produrl, 
isc_products.prodcalculatedprice, 
isc_products.proddesc, 
isc_products.prodcurrentinv, 
isc_products.upc, 
isc_categories.categoryid, 
isc_categories.catparentid, 
isc_categories.catname, 
isc_product_images.imagefilestd, 
isc_product_images.imagefilethumb, 
isc_brands.brandname 
FROM isc_products 
INNER JOIN isc_categories 
ON isc_products.prodcatids = isc_categories.categoryid 
INNER JOIN isc_product_images 
ON isc_products.productid = isc_product_images.imageprodid 
INNER JOIN isc_brands 
ON isc_products.prodbrandid = isc_brands.brandid 
WHERE isc_categories.categoryid = 17 
OR isc_categories.categoryid = 15 
OR isc_categories.categoryid = 16 
OR isc_categories.categoryid = 12 
OR isc_categories.categoryid = 13 
OR isc_categories.categoryid = 14 
OR isc_categories.categoryid = 11 
OR isc_categories.categoryid = 10 
AND isc_products.prodcurrentinv > 1 
AND isc_products.prodcalculatedprice > 1.00 
ORDER BY isc_categories.catname 
") 
or die(mysql_error()); 


while($row = mysql_fetch_array($result)){ 
print_r ($row); 
} 





// end of file 
echo '<br/>****** Script successfully run! ******'; 
?> 
</pre> 

これについてのご意見はありがたいです。 免責事項あなたの最初の考えが「なぜあなたはしていないのですか?」と思っているのなら、それは私がそれを知らなかったか、知らなかったからです。 :)ある日、私の友人...ある日私はします。ハハハ

ありがとう!

+0

データまたは少なくともスキーマを表示する必要があります。 –

答えて

2

LEFT JOINを使用して内部結合を置換してから、結果を確認してください。あなたはあなたが期待している28を見ますか?そうであれば(またはもっと見ると)、結合は何らかの形で間違っています。

+0

ありがとう、rainecc!これが問題でした。今、私はこれを理解しようともっと時間を費やし、内部結合がうまくいかない理由を説明します。私は結合を理解したと思ったが、これは私がそうでないことを示す。 :)それらをすべて左の結合に変更すると、すべての商品が表示されます。ありがとう!! – Tsanders

2

これはおそらくINNER JOINです。 INNER結合は、結合の両側にNON-NULLフィールドがある行を返します。商品が添付されていないカテゴリを取得する場合は、(クエリの構造に応じて)LEFTまたはRIGHT結合が必要です。これらは、結合の左側または右側にデータがある場合はレコードを返しますが、反対側にはnullが返されます。

4

あなたの問題は、古典的なSQLのコーディングの問題である:ORはbaciallyあなたORの周りに括弧を入れてしなければならないことを意味ANDに優先し、持っている、それ以外の場合はA OR (B OR (C AND D))あなたが期待したいようではない(A OR B OR C) AND Dとして解析されています。

これを試してみてください:

WHERE (-- note opening bracket 
    isc_categories.categoryid = 17 
    OR isc_categories.categoryid = 15 
    OR isc_categories.categoryid = 16 
    OR isc_categories.categoryid = 12 
    OR isc_categories.categoryid = 13 
    OR isc_categories.categoryid = 14 
    OR isc_categories.categoryid = 11 
    OR isc_categories.categoryid = 10 
) -- note closing bracket 
AND isc_products.prodcurrentinv > 1 
AND isc_products.prodcalculatedprice > 1.00 

また、あなたは完全にこの問題を回避することができ、およびにあなたのwhere句を簡素化することにより、読み、あなたのSQLを簡単にする:

WHERE isc_categories.categoryid in (10,11,12,13,14,15,16,17) 
AND isc_products.prodcurrentinv > 1 
AND isc_products.prodcalculatedprice > 1.00 

たり、自分の価値観理由

WHERE isc_categories.categoryid between 10 and 17 
AND isc_products.prodcurrentinv > 1 
AND isc_products.prodcalculatedprice > 1.00 
+0

最初のコメントが誤って削除されましたが、この情報をお寄せいただきありがとうございます。フィードに選択的に含める必要のある89カ所以上のカテゴリがあるプロダクションに移行すると非常に役に立ちます。 – Tsanders

関連する問題