【问题标题】:Is there a better way to optmize a mysql where clause with multiple IN & AND statements [closed]有没有更好的方法来优化具有多个 IN & AND 语句的 mysql where 子句 [关闭]
【发布时间】:2022-01-19 17:54:45
【问题描述】:

给定一个 ProductID 编号列表,我需要找到包含所有列出的 ProductID 编号的发票的详细信息。列表中的项目数是动态的。表格看起来像这样。

产品

产品ID 产品名称

发票

发票 ID 订购日期 客户编号

发票_产品

数量 产品编号 发票编号

现在我正在使用 MySQL SQL 语句,但我认为性能可能会成为一个问题。我不确定是否有更好的方法来写这个:

Select InvoiceId, DateOrdered, CustomerID
from Invoices
where InvoiceID in (
     select InvoiceID from Invoice_Products where ProductID = 5
)
AND 
InvoiceID in (
     select InvoiceID from Invoice_Products where ProductID = 100
)
AND
InvoiceID in (
     select InvoiceID from Invoice_Products where ProductID = 1005
)

我的产品列表将由多选产品框提供。只应显示所有项目匹配的发票,否则我只会使用 in 语句进行内部连接。

【问题讨论】:

  • 使用 WHERE EXISTS 而不是 WHERE IN。

标签: mysql sql query-optimization


【解决方案1】:

根据我的经验,JOIN 几乎总是比 IN subquery 好。

您可以在一次查询中获取所有发票 ID。

SELECT i.InvoiceId, i.DateOrdered, i.CustomerID
FROM Invoices i
JOIN (
    SELECT InvoiceID
    FROM Invoice_Products
    WHERE ProductID IN (5, 100, 1005)
    GROUP BY InvoiceID
    HAVING COUNT(DISTINCT ProductID) = 3
) AS ip ON i.InvoiceID = ip.InvoiceID

有关子查询的说明,请参阅How to return rows that have the same column values in MySql

【讨论】:

  • HAVING COUNT(DISTINCT ProductID) = 3,不是==
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多