我们说我有emails
和priority
表:
优先级表字段:
Fields: uid, priority
电子邮件表格字段:
Fields: id, uid, content
每个用户都有很多电子邮件。在脚本中,我根据用户的优先级(通过加入2个表)来获取用户的电子邮件。但是当我批量获取并且具有最高优先级的用户在队列中有1000个邮件时问题就出现了。第二个用户的优先级为99.我应该发送最多2个优先级最高的用户的电子邮件,因为在第一个用户的第三个记录中,他的优先级为97,低于第二个用户。
如何解决这个问题?我在PHP
编程,所以如果在PHP
中更好地解决了解决方案,请告诉我如何解决。
这是主要查询:
select * from emails e left join by priority p on e.uid=p.uid order by priority DESC
EDIT1:
电子邮件表中的数据:
id uid email_content
1 321 some example data
2 434 some other example data
3 321 another from first user
4 321 again another from 321
优先级表中的数据如下:
id uid priority
1 321 100
2 434 99
uid
等于321的用户首先具有最高优先级,但并非所有电子邮件都具有最高优先级。发送第一封电子邮件时,优先级应为99,第二封电子邮件优先级等于98.现在不应发送第三封电子邮件,并且uid为434的用户的电子邮件优先级最高。
由于我已经获取了10条记录,因此未获取更新的优先级!
答案 0 :(得分:0)
只需简单地获取一个用户。发送电子邮件,然后只更新优先级。
<?php
$mysqli = new mysqli("127.0.0.1", "root","", "stackoverflow");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$query = "SELECT e.id, email_content,p.uid from emails e INNER JOIN priority p ON e.uid=p.uid ORDER BY priority DESC LIMIT 1";
$updateQuery = "UPDATE priority SET priority = priority - 1 WHERE uid = ?";
while (true) {
$result = $mysqli->query($query);
if ($result->num_rows == 0) {
break;
}
$row = $result->fetch_row();
// @TODO send the mail
// delete the email entry
$mysqli->query("DELETE FROM emails WHERE id = $row[0]");
// NOW update the PRIORITY
$mysqli->query("UPDATE priority SET priority = priority - 1 WHERE uid = $row[2]");
}