基于多个记录条件返回结果



我需要从交易列表中返回同时包含产品a和产品B的发票

表格示例

prod_code | invoice
 apple    |  100
 banana   |  100
 orange   |  100
 apple    |  101
 kiwi     |  101
 grape    |  101
 apple    |  102
 banana   |  102
 grape    |  102

我需要输入两个产品,它必须列出两个产品的发票号码。如果我输入苹果和香蕉,它必须返回100和102如果我输入苹果和葡萄,它会返回101和102

这看起来应该很简单,但就我的生活而言,我无法思考如何做到这一点。

已解决

好的,我解决了我自己的问题。不知道为什么我没有早点想到。正如我所认为的,这很简单。

select invoice from transaction where prod_code="apple" and invoice in (select invoice from transaction where prod_code="banana")
SELECT
  invoice
FROM
  transactions
WHERE
  prod_code IN ('apple', 'banana')
GROUP BY
  invoice
HAVING
  COUNT(DISTINCT prod_code) = 2

但是,请注意,这不是一个快速查询,而且使用现有的结构,要显著提高性能并不容易。

从本质上讲,第一步必须由find all invoices with 'apple' <OR> 'banana'执行,并且仅在此之后才能筛选到同时具有两者的发票。

另一种选择是…

SELECT
  t_apple.invoice
FROM
  transactions     AS t_apple
INNER JOIN
  transactions     AS t_banana
    ON t_apple.invoice = t_banana.invoice
WHERE
      t_apple.prod_code  = 'apple'
  AND t_banana.prod_code = 'banana'

但推广到n prod_code就不那么简单了。

最新更新