MySQL Query:当另一列中的值与特定条件匹配时,返回一列中具有特定值的所有行

时间:2013-08-06 07:39:58

标签: mysql

这可能有点难以回答,因为我仍在学习编写查询,而目前我无法查看数据库,但我会试一试。

我正在尝试从中获取信息的数据库包含一个大型表(TransactionLineItems),它基本上用作存储事务日志。该表当前包含大约500万行和几列描述每个事务中包含的产品(TLI_ReceiptAlias,TLI_ScanCode,TLI_Quantity和TLI_UnitPrice)。此表有一个外键,它与另一个表(Transactions)中的主键配对,该表包含事务号(TRN_ReceiptNumber)。当我加入这两个表时,查询为我们销售的每个项目返回一行,每行都有一个收据编号。 16行可能具有相同的收据编号,这意味着所有这些项目都在单个交易中出售。下面可能还有12行,每行共享另一个收据号。所有交易都分为多行,如下所示。

我正在尝试构建一个查询,该查询返回共享单个收据编号的所有行,其中至少有一个收据编号的行符合另一列中的某些条件。例如,三种不同类型的礼品卡在TLI_ScanCode列中都具有以“740000”开头的值。我希望查询返回TLI_ScanCode列中以这六个数字开头的值的行,但我还希望返回与任何符合给定扫描代码条件的行共享收据编号的所有行。基本上,我需要查询返回每个收据编号的所有行,这些收据编号也至少在一行中与礼品卡相关的扫描代码配对。

我尝试使用子查询返回与礼品卡扫描代码配对的所有收据编号的列,使用“WHERE A.TRN_ReceiptAlias IN(子查询 ...”)仅返回那些行一个收据编号,与子查询返回的一个收据编号相匹配。这似乎在服务器停止处理查询时停止运行五分钟而没有问题。查询似乎成功完成,但鉴于此我正在与IT合作恢复正常的商店运营,在此期间我未能获得查询结果(除了相关的羞耻和尴尬)。

我想知道是否有办法编写查询来获取此信息而不会导致服务器挂起。我假设要么:a)在这么大的表上以这种方式使用子查询不是很聪明,或者b)我不太了解SQL以获取我需要的信息。我假设答案是A和B,但我非常想学习如何以正确的方式做到这一点。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

SELECT *
  FROM a as a1
  JOIN b
    ON b.id = a.id
  JOIN a as a2
    ON a2.id = b.id
 WHERE b.some_criteria = 'something';

在(b.id,b.some_criteria)

上加入索引

答案 1 :(得分:0)

您不是第一个人,也不会是最后一个使用低效查询来关闭系统的人。

最重要的一课是“决策支持”和“分析”实际上并不与交易系统共存。您确实希望将数据提取到数据集市或数据仓库或其他非交易数据库的数据库中,这样您就不会使业务脱机。

在理解为什么初始查询效率太低的情况下,您需要熟悉EXPLAIN EXTENDED语法,该语法会返回计划信息,这些信息可以帮助您调试查询并使其具有可接受的性能。如果您使用实际的解释计划输出更新您的问题,那将有助于确定问题所在。

只是从你提供的大纲中,它听起来像是自我联接而不是子查询。