1

我正在为我的会员计划编写数据馈送脚本,我真的以为我在“做”,但是当我运行该脚本时,它创建的 CSV 文件只有 28 个产品中的 7 个。在测试之前,我使所有产品都符合查询条件,所以它们都应该被包括在内。我什至删除了库存水平和价格条件。仍然只有 28 个中的 7 个被添加到 csv 文件中,5 个来自一个类别,2 个来自另一个。第一类只有 5 件商品,全部退货。但是第二类的 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,这基本上意味着你必须在你OR的 s 周围加上括号,否则它会被解析为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 连接(取决于您如何构建查询)。那些将返回在连接的左侧或右侧有数据的记录,但在另一侧为空。

于 2012-04-06T15:55:00.900 回答
2

尝试用 LEFT JOIN 替换内部连接,然后查看结果。你看到你期望的28了吗?如果是这样(或者您看到更多),则连接在某种程度上是不正确的。

于 2012-04-06T15:55:41.170 回答