为什么我的MySQL查询只返回28条记录中的7条?

时间:2012-04-06 15:50:26

标签: mysql inner-join

我正在为我的Affiliate计划编写datafeed脚本,并且真的以为我“在做它”但是当我运行脚本时,它只创建了28个产品中的7个的CSV文件。在测试之前,我使所有产品都符合查询条件,因此它们都应该包括在内。我甚至删除了库存水平和价格条件。仍然只有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>

对此的任何想法将不胜感激。 Dislcaimer 如果你的第一个想法是“你为什么不......”这是因为我没有或者不知道它。 :)有一天,我的朋友......有一天我会的。哈哈哈哈

谢谢!

3 个答案:

答案 0 :(得分:4)

您的问题是一个典型的SQL编码问题:OR优先于AND,这实际上意味着您必须在OR周围添加括号,否则将其解析为{{1}你想要的不是A OR (B OR (C AND D))

试试这个:

(A OR B OR C) AND D

此外,您可以完全避免此问题,并通过简化where子句来使SQL更易于阅读:

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 isc_categories.categoryid in (10,11,12,13,14,15,16,17)
AND isc_products.prodcurrentinv > 1
AND isc_products.prodcalculatedprice > 1.00

答案 1 :(得分:2)

最有可能的是导致此问题的INNER JOIN。 INNER连接将返回连接两侧都有NON-NULL字段的行。如果您想获得没有附加产品的类别,您将需要LEFT或RIGHT连接(取决于您如何构建查询)。那些将返回记录,其中有关于连接的左侧或右侧的数据,但是在另一侧的空值。

答案 2 :(得分:2)

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