通过组合来自其他两个表的前n行来填充表

时间:2012-01-30 12:13:23

标签: mysql sql join

我有两张表,简化为以下内容:

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

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

我还有第三个表,包含一对ID:

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

当用户的行超过两周时,我需要定期向收件人表插入新的ID对(查询将安排为每天运行一次)。不应检索收件人表中已存在的ID。

我目前无法找到从两个初始SELECT查询中返回任意配对ID的有效方法:

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*

到目前为止,我所有尝试过的JOINS都未能达到预期效果。我已经使用上面的两个查询建立了一个解决方案,使用PHP for循环在结果插入之前将结果配对,但我非常清楚这很差。

提前致谢,

1 个答案:

答案 0 :(得分:1)

您可以创建笛卡尔积并使用Recipients

删除NOT EXISTS中已存在的组合

Cartesian Product

  

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
       )