在我的数据库中,我有一个“销售”表和一个“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;
有什么想法吗?
答案 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;