2015-02-09 63 views
1

这个问题是基于:Select row from left join table where multiple conditions are true选择在使用时不工作=在WHERE子句(使用GROUP BY和HAVING COUNT)

我现在试图选择从表1行,不具有在连接表2给出了某个属性ID。

这些是表:

表1

| ID | Name | 
| 1 | test | 
| 2 | hello | 

表2

| ID | PropertyID | 
| 1 |  3  | 
| 1 |  6  | 
| 1 |  7  | 
| 2 |  6  | 
| 2 |  1  | 

我使用下面的查询(这正与 '=') :

SELECT tab1ID 
FROM table2 
WHERE propertyID != 3 OR propertyID = 6 
GROUP BY tab1ID 
HAVING COUNT(*) = 2; 

该查询应返回ID = 2,但它返回零行。我做错了什么?

任何帮助,非常感谢!

编辑:我曾经给一个MWE,但是这是我的实际查询:

SELECT transactionline.total FROM transactionline 
LEFT JOIN product_variant ON product_variant.SKU = transactionline.SKU 
LEFT JOIN product ON product_variant.productID = product.productID 
LEFT JOIN connect_option_product ON connect_option_product.productID = product.productID 
LEFT JOIN productattribute_option ON productattribute_option.optionID = connect_option_product.optionID 
WHERE productattribute_option.optionID = 4 OR productattribute_option.optionID = 9 
GROUP BY transactionline.lineID 
HAVING COUNT(*) = 1 
AND SUM(productattribute_option.optionID = 4) = 0 
AND SUM(productattribute_option.optionID = 9) > 0 

产品可以具有对optionID的多个连接。此查询的目标是选择某些过滤器为true或false的总量。

+0

它应该返回2,而不是1,对不对? – 2015-02-09 10:40:40

+0

谢谢你提到,我的坏! – bashoogzaad 2015-02-09 10:41:24

+0

它也应该retirm ID = 1或我在这里错过了什么?无论如何在[SQLFiddler](http://sqlfiddle.com/#!3/6e722/2)它适用于我 – mucio 2015-02-09 10:47:09

回答

4

您的分组是正确的。但是您需要计算您的组不需要所需的值。该数字必须为零。

SELECT tab1ID 
FROM table2 
GROUP BY tab1ID 
HAVING sum(propertyID = 6) > 0 
AND sum(propertyID = 3) = 0 
+0

感谢您的回答!我正在尝试使用我的实际查询工作(请参阅更新后的文章),但尚未弄清楚。当你看到实际的查询时是否有任何事情需要考虑? – bashoogzaad 2015-02-09 10:58:36

+0

我忘了删除where子句。更新它。为什么你需要一个'有数(*)= 1'? – 2015-02-09 11:03:08

+0

再次更新:) – 2015-02-09 11:04:57