mysql select where count = 0

时间:2010-06-15 12:25:32

标签: mysql

在我的数据库中,我有一个“销售”表和一个“sales_item”。有时,出现问题并且销售被记录但不记录销售项目 所以我试图从我的表“sales”中获取sales_item表中没有任何行的salesID。

这是我认为可行的mysql查询,但它没有:

SELECT s.*
FROM sales s NATURAL JOIN sales_item si
WHERE s.date like '" . ((isset($_GET['date'])) ? $_GET['date'] : date("Y-m-d")) . "%'
AND s.sales_id like '" . ((isset($_GET['shop'])) ? $_GET['shop'] : substr($_COOKIE['shop'], 0, 3)) ."%'
HAVING count(si.sales_item_id) = 0;

有什么想法吗?

7 个答案:

答案 0 :(得分:14)

表别名v的确来自何处? 显示表定义将是一个非常好的主意;)

必须是左连接:

SELECT *
FROM table1
LEFT JOIN table2 ON(table1.id = table2.table1_id)
WHERE table2.table1_id IS NULL

表1是您的销售表,表2是sales_item

答案 1 :(得分:4)

您不需要加入表格,您可以使用以下内容:

[...] WHERE sales.id NOT IN (SELECT sales_id FROM sales_item)

这仅过滤没有任何相应sales_item条目的销售。

答案 2 :(得分:4)

始终与Group By一起使用

GROUP BY si.sales_item_id
HAVING count(si.sales_item_id) = 0;

答案 3 :(得分:1)

为了完整......

SELECT S.*
FROM SALES S 
WHERE NOT EXISTS (
    SELECT 1 
    FROM SALES_ITEM SI 
    WHERE SI.SALES_ITEM_ID = S.ID)

MySQL可能存在IN子句的问题。

答案 4 :(得分:0)

假设sales_item中的每个项目都有一个关联的sales_id,您可能正在寻找没有项目的所有销售。

使用子查询怎么样?从items表中不存在id的sales表中获取所有sales_id ...

SELECT * from sales where sales_id not in (SELECT DISTINCT sales_id from sales_item)

(注意:确切的语法可能有误,但如果我理解正确的话,这个想法应该是合理的)

答案 5 :(得分:0)

连接限制了要显示的行。 我的建议是忘记加入和使用这样的东西:

选择* 来自销售 其中salesId不在(从sales_item中选择salesId)

基本上,返回没有任何关联sales_item的销售。

祝你好运

答案 6 :(得分:0)

您应该按销售商品ID对行进行分组。

SELECT s.id, count(*) as no_of_items
FROM sales s NATURAL JOIN sales_item si
WHERE s.date like '" . ((isset($_GET['date'])) ? $_GET['date'] : date("Y-m-d")) . "%'
  AND v.sales_id like '" . ((isset($_GET['shop'])) ? $_GET['shop'] : substr($_COOKIE['shop'], 0, 3)) ."%'
GROUP BY si.salesitem_id
HAVING no_of_items = 0;