簡體   English   中英

MySQL查詢:當另一列中的值符合特定條件時,返回一列中具有特定值的所有行

[英]MySQL Query: Return all rows with a certain value in one column when value in another column matches specific criteria

考慮到我仍在學習編寫查詢並且目前無法查看數據庫,這可能有點難以回答,但是我會試一試。

我試圖從中獲取信息的數據庫包含一個大表(TransactionLineItems),該表實際上起着商店事務日志的作用。 該表當前包含約500萬行和幾列,描述了每筆交易中包含的產品(TLI_ReceiptAlias,TLI_ScanCode,TLI_Quantity和TLI_UnitPrice)。 該表具有一個外鍵,該外鍵與另一個表(事務)中的主鍵配對,並且該表包含事務編號(TRN_ReceiptNumber)。 當我連接這兩個表時,查詢將為我們售出的每件商品返回一行,並且每一行都有一個收據編號。 16行可能具有相同的收據編號,這意味着所有這些項目都是在一次交易中出售的。 在此之下可能還有12行,每行共享另一個收據編號。 像這樣將所有事務分解成多行。

我正在嘗試建立一個查詢,該查詢返回所有共享一個收據號的行,其中至少一個具有該收據號的行滿足另一列中的某些條件。 例如,三種獨立類型的禮品卡在TLI_ScanCode列中均具有以“ 740000”開頭的值。 我希望查詢返回的行的值在TLI_ScanCode列中以這六位數字開頭,但是我還想返回所有與給定掃描代碼條件的行共享收據號的所有行。 本質上,我需要查詢以返回每個收據編號的所有行,該收據編號也至少與禮品卡相關的掃描代碼配對。

我嘗試使用子查詢返回所有收據編號與禮品卡掃描碼配對的列,並使用“ WHERE A.TRN_ReceiptAlias IN( 子查詢 ...”)僅返回那些收據編號與其中一個收據編號匹配的行由子查詢返回。這似乎沒有問題運行了五分鍾,然后服務器在處理查詢時又停了二十分鍾,查詢似乎成功完成了,但是鑒於我正在與IT一起恢復正常的商店運作在這段時間里,我沒有獲得查詢的結果(除了相關的恥辱和尷尬)。

我想知道是否有一種方法編寫查詢以獲取此信息而不會導致服務器掛起。 我假設是: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 EXTENDED語法,該語法將返回您計划的信息,這些信息將幫助您調試查詢並努力使其能夠令人滿意地執行。 如果使用實際的解釋計划輸出來更新問題,這將有助於確定問題所在。

僅從您提供的大綱來看,聽起來像是自我聯接而不是子查詢很有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM