Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询:当一列中的值与特定条件匹配时,返回该列中具有特定值的所有行_Mysql - Fatal编程技术网

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

MySQL查询:当一列中的值与特定条件匹配时,返回该列中具有特定值的所有行,mysql,Mysql,这可能有点难以回答,因为我仍在学习编写查询,目前无法查看数据库,但我会尝试一下 我试图从中获取信息的数据库包含一个大表(TransactionLineItems),该表基本上用作存储事务日志。该表目前包含约500万行和数列,描述了每笔交易中包含的产品(TLI_ReceiptAlias、TLI_扫描码、TLI_数量和TLI_单价)。此表有一个外键,外键与另一个表(事务)中的主键配对,此表包含事务编号(TRN_ReceiptNumber)。当我连接这两个表时,查询会为我们销售过的每件商品返回一行,每

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

我试图从中获取信息的数据库包含一个大表(TransactionLineItems),该表基本上用作存储事务日志。该表目前包含约500万行和数列,描述了每笔交易中包含的产品(TLI_ReceiptAlias、TLI_扫描码、TLI_数量和TLI_单价)。此表有一个外键,外键与另一个表(事务)中的主键配对,此表包含事务编号(TRN_ReceiptNumber)。当我连接这两个表时,查询会为我们销售过的每件商品返回一行,每行都有一个收据号。16行可能具有相同的收据编号,这意味着所有这些项目都是在一次交易中售出的。下面可能还有12行,每行共享一个收据号。所有事务都分解为多行,如下所示

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

我尝试使用一个子查询返回一列所有收据号码和礼品卡扫描代码,使用“WHERE a.TRN_ReceiptAlias IN(子查询…”仅返回收据编号与子查询返回的其中一个收据编号相匹配的行。这似乎运行了五分钟没有问题,然后服务器在处理查询时又停止了二十分钟。查询似乎已成功完成,但考虑到我正在使用它还原否rmal存储操作在此期间,我未能获得查询结果(除了相关的羞耻和尴尬)

我想知道是否有一种方法可以在不导致服务器挂起的情况下编写查询来获取此信息。我假设:a)在如此大的表上以这种方式使用子查询不是很明智,或者b)我对SQL了解不够,无法获取所需的信息。我假设答案是A和B,但我非常想学习如何正确地做这件事。任何帮助都将不胜感激。谢谢

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)上包含索引。

您不是第一个使用低效查询破坏系统的人,也不会是最后一个

最重要的教训是,“决策支持”和“分析”实际上并不与交易系统共存。您确实希望将数据拉入数据集市、数据仓库或其他非事务数据库的数据库,这样您就不会使业务离线

为了理解初始查询效率低下的原因,您需要熟悉EXPLAIN扩展语法,该语法返回计划信息,帮助您调试查询并使其执行得令人满意。如果用实际的解释计划输出更新问题,这将有助于确定问题是什么


仅从您提供的大纲来看,听起来自联接比子查询更有意义。

显示查询和表关系使用联接。MySQL在优化(子查询)中的
方面非常糟糕,但只要您有适当的索引,它的连接就非常好。我想知道这个问题是否可以不那么详细。