如何在不创建临时表的情况下进行MySQL查询?

时间:2011-11-21 23:15:04

标签: php mysql sql join 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,我需要对此查询进行选择,这里是catch。我需要排除一些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

这很好用,唯一的事情就是我需要通过不创建任何表来重做所有这些逻辑。也许做一些加入,我不知道该怎么做。

我希望这不会让人感到困惑。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

现在怎么样?:

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的结果

答案 1 :(得分:0)

您只需添加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;

虽然,如果你的索引是好的和理智的,而你的数据集不是很大,那么性能应该很接近。