Как сделать запрос MySQL без создания временных таблиц? - PullRequest
0 голосов
/ 22 ноября 2011

У меня тут какая-то ситуация.

У меня есть запрос:

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;

Теперь, если переменная не установлена, мне нужно сделать выборку для этого запроса, и здесь есть подвох. Мне нужно исключить некоторые идентификаторы. Вот как я это делаю сейчас.

Я создаю таблицу с этим запросом: 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 голосов
/ 22 ноября 2011

Вам просто нужно добавить условие 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;

Хотя, если ваши индексы хорошие и вменяемые, а наборы данных не огромны, производительность должна быть близка.

0 голосов
/ 22 ноября 2011

А теперь как насчет этого?:

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

Это включает только результаты, в которых testrecurring.id НЕ НАЙДЕН в future_recurring

...