Заполнение таблицы путем объединения верхних n строк из двух других таблиц - PullRequest
1 голос
/ 30 января 2012

У меня есть две таблицы, упрощенные до следующего:

users:
+-----+------+-----------+
| id  | name | timestamp |
+-----+------+-----------+

vouchers:
+-----+------+
| id  | code |
+-----+------+

У меня также есть третья таблица, содержащая пары идентификаторов:

recipients:
+-----+------+------+
| id  | u_id | v_id |
+-----+------+------+

Мне нужно периодически вставлять новые пары идентификаторов в таблицу получателей, когда строка пользователя старше двух недель (запрос будет запускаться один раз в день). Идентификаторы, уже присутствующие в таблице получателей, извлекать не следует.

В настоящее время я не могу найти эффективный способ возврата произвольно парных идентификаторов из двух начальных запросов SELECT:

1. SELECT id FROM users WHERE date < NOW() - INTERVAL 2 WEEK AND id not in (select u_id from recipients)

2. SELECT id FROM vouchers WHERE id not in (select v_id from recipients) limit *by number of retrieved user IDs*

Пока что все мои попытки соединения не смогли достичь желаемого результата. Я нашел решение, использующее два вышеупомянутых запроса, с циклом PHP for для объединения результатов перед их вставкой, но я прекрасно понимаю, что это плохо.

Заранее спасибо,

1 Ответ

1 голос
/ 30 января 2012

Вы можете создать декартово произведение и удалить комбинации, уже присутствующие в Recipients, используя NOT EXISTS

декартово произведение

INNER JOIN и, (запятая) семантически эквивалентны в отсутствие условия соединения: оба производят декартово произведение между указанными таблицами (то есть каждая строка в первой таблице объединяется с каждой строкой во второй таблице).

SELECT *
FROM   users u
       , vouchers v
WHERE  u.timestamp < NOW() -INTERVAL 2 WEEK
       AND NOT EXISTS (
         SELECT  *
         FROM    Recipients r
         WHERE   r.u_id = u.id
                 AND r.v_id = v.id
       ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...