1

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

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

より複雑なSQLクエリを作成しようとするのはこれが初めてです(とにかく初心者向け)。

print_rを使用すると、問題はクエリにあることがわかりました。私は以前にこれが機能していたと思いました。それが機能していたときと現在の違いは、categoryidとcatparentidを取得することを含めたことです。ただし、これらの追加を削除しても、同じ結果が得られます。以前は、より大きな製品データベースで機能していたと思っていたかもしれませんが、実際にはすべての製品が返されていなかったのかもしれませんが、非常に多くの製品が返されていると思いました。

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

関連付けられていない製品(つまり、カテゴリの関連付けがない製品)を確認するためにクエリを実行すると、すべての製品がカテゴリに関連付けられます。

すべての商品にイメージとブランドの関連性があるので、それも問題ではないと思います。

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>

これについての考えをいただければ幸いです。あなたの最初の考えが「なぜあなたはしなかったのか...」であるなら、それは私がそれについて知らなかったか、知らなかったからです。:)ある日、私の友人...いつか私はそうします。ハハハッハッハ

ありがとうございました!

4

3 に答える 3

4

あなたの問題は古典的なSQLコーディングの問題です:OR優先順位がANDあります。これは基本的に、sを角かっこで囲む必要があることを意味しますOR。そうしないと、期待どおりに解析され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
于 2012-04-06T15:57:06.350 に答える
2

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

于 2012-04-06T15:55:00.900 に答える
2

内部結合をLEFTJOINに置き換えてみて、結果を確認してください。あなたはあなたが期待する28を見ますか?もしそうなら(またはもっと見る)、結合は何らかの形で正しくありません。

于 2012-04-06T15:55:41.170 に答える