【问题标题】:How to select all items that have no orders?(that are not on any receipt)如何选择所有没有订单的项目?(不在任何收据上)
【发布时间】:2021-12-05 13:01:22
【问题描述】:
@Query(value="SELECT i.name\n" +
            "FROM item as i\n" +
            "INNER JOIN items_receipts as ir\n" +
            "    ON i.id = ir.item_id\n" +
            "INNER JOIN receipt as r\n" +
            "    ON ir.receipt_id = r.id\n" +
            "GROUP BY i.id\n" +
                "HAVING COUNT(r.id)=0"
            ,nativeQuery = true)
    List<String> fiveSales();

为什么这个查询似乎不起作用?是因为计数为空还是其他原因?

【问题讨论】:

  • 您的图像是关于不同结构的,但是在工作台中进行查询,然后先尝试不使用连接,然后添加连接,最后添加,这样您就可以看到会发生什么
  • 抱歉旧图片已将订单改为收据
  • 查询会起作用,您是否外连接收据表,从而保留不匹配的项目行。但我不推荐这个。使用这种方法,您可以计算所有项目的所有订单,只是找到一些根本没有订单的项目。只选择 item_receipts 表中没有条目的项目更容易(即,当 DBMS 看到该表中项目的第一个条目时,它可以停止查找)。请参阅我对此的回答。

标签: mysql sql spring-boot


【解决方案1】:

您正在加入表格。这样你就得到了所有订购的物品。现在您查看该数据集,并为该数据集中的每个项目计算行数。问题是:您想要数据集中的项目。

对于查找,请使用 [NOT] EXISTS[NOT] IN

select *
from item
where id not in (select item_id from items_receipts);

select *
from item i
where not exists (select null from items_receipts ir where ir.item_id = i.id);

【讨论】:

  • 我喜欢select null。对于许多开发人员来说,这可能违反直觉,但绝对正确。
  • mysql 是否不忽略所有 Select 列独立于其中的内容?
  • 它正在工作,谢谢:)
  • @nbk:是的,在EXISTS 子句中,选定的列在 MySQL 中无关紧要。但是,在其他一些 DBMS 中,当子查询中存在聚合并且所选列使子查询无效时,您可能会收到语法错误。 NULL 在我看来是一个不错的选择,因为它适用于任何情况和任何 DBMS。
  • @ThorstenKettner 我更喜欢 1,所以很明显你得到了
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 2021-07-13
  • 2015-08-07
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多