我有两张表,简化为以下内容:
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循环在结果插入之前将结果配对,但我非常清楚这很差。
提前致谢,
答案 0 :(得分:1)
您可以创建笛卡尔积并使用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
)