簡體   English   中英

如何在不創建臨時表的情況下進行MySQL查詢?

[英]How to do a MySQL query without creating temp tables?

我這里有點情況。

我有一個查詢:

SELECT DISTINCT (testrecurring.id), testrecurring.cxl, testci.cd
FROM testci, testrecurring 
WHERE (testci.id = testrecurring.id) 
AND testci.x_origin='1' 
ORDER BY testrecurring.id DESC;

現在,如果未設置var,則需要對此查詢進行選擇,這就是問題所在。 我需要排除一些ID。 這就是我現在的做法。

我用該查詢創建一個表: create table xxx SELECT * .....現在,我先前查詢的結果在另一個名為xxx表中。

然后:

if (!isset($var)) {
    $delete = mysql_query("delete from xxx USING xxx, future_recurring where xxx.id = future_recurring.id");
}

在刪除記錄之后,我將最終select * from xxx

這工作得很好,唯一的是我需要通過不創建任何表來重做所有這些邏輯。 也許做一些連接,我不確定如何繼續。

我希望這不是很令人困惑。

有任何想法嗎?

現在呢?:

SELECT tr.id, tr.cxl, tci.cd
FROM testci AS tci 
INNER JOIN testrecurring AS tr
    ON tci.id = tr.id
LEFT OUTER JOIN future_recurring AS fr
    ON tr.id = fr.id
WHERE tci.x_origin='1' 
    AND fr.id IS NULL
GROUP BY tr.id, tr.cxl, tci.cd
ORDER BY tr.id DESC

這僅包括在future_recurring中未找到testrecurring.id的結果

您只需要添加一個where條件即可排除不需要的行:

SELECT * 
FROM testci
JOIN testrecurring on testrecurring.id = testci.id
WHERE testci.x_origin='1' 
      AND testci.id NOT IN (SELECT id FROM future_recurring)
ORDER BY testrecurring.id DESC;

或者,您可以嘗試這樣做,以獲得更好的性能:

SELECT * 
FROM testci
JOIN testrecurring on testrecurring.id = testci.id
LEFT JOIN future_recurring on future_recurring.id = testci.id
WHERE testci.x_origin='1' 
      AND future_recurring id IS null
ORDER BY testrecurring.id DESC;

雖然,如果您的索引良好且理智,並且數據集不是很大,則性能應該接近。

暫無
暫無

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

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