[英]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.