Php sulotion通过一封电子邮件通知用户他们最喜欢的更新店铺

Php sulotion通过一封电子邮件通知用户他们最喜欢的更新店铺,php,mysql,Php,Mysql,我不确定这是不是一个合适的地方问这个问题,但我尝试一下 我正在为电子商店或商店网络编写一种社交网络 有一个名为followers的表,它显示了跟踪哪个商店的人 表1: 追随者 +-----------+---------------------+---------+---------+ | id | shop_id | user_id | date | +-----------+---------------------+---------+----

我不确定这是不是一个合适的地方问这个问题,但我尝试一下

我正在为电子商店或商店网络编写一种社交网络

有一个名为followers的表,它显示了跟踪哪个商店的人

表1:

追随者

+-----------+---------------------+---------+---------+ 
| id        | shop_id             | user_id | date    |
+-----------+---------------------+---------+---------+
|  1        | 1                   |    23   |392185767| 
+-----------+---------------------+---------+---------+
|  2        | 1                   |    34   |392333337| 
+-----------+---------------------+---------+---------+
每次商店发布产品时,我都会将其放在更新表中(如果还没有),以跟踪更新的商店

表2:

更新

+-----------+---------------------+----------+---------+ 
| id        | shop_id             |UPcounter | UPdate  |
+-----------+---------------------+----------+---------+
|   1       | 2                   |      1   |392185767| 
+-----------+---------------------+----------+---------+
|   2       | 1                   |      3   |392333337| 
+-----------+---------------------+----------+---------+
所以问题是,我想通过电子邮件通知追随者他们最喜欢的商店的更新

最简单的方法是每次阅读更新后的店铺1行,找到他们的追随者并向他们发送电子邮件,我使用crone job来运行此功能

//select one updated shop
$uopdated_shop = $db->query("select updates.* , shops.* from updates  JOIN shops ON updates.shop_id = shops.id LIMIT 1");
if(!$uopdated_shos){ exit; }

// get it's followers
$followers = $db->query(" slsect f.* , u.* from followers f JOINE users u ON f.user_id = u.id
where f.shop_id = $uopdated_shop->id JOIN ");

$email->send($followers , $uopdated_shop , $sleep_betwwen_emails = 200 );
但这样一来,一个用户每天可能收到多达20-30封电子邮件。。。假设他在跟踪20-30家商店

我正在寻找一种解决方案或算法,向每个用户发送他所关注的更新店铺列表,而不是为每个更新店铺发送一封电子邮件


一种方法是在所有用户中循环,让每个用户跟踪商店,并在更新的商店中查找他们,但是有几千个用户可能需要几天才能完成

我想你应该把商店的名字连在一起。比如:

select u.*, group_concat(s.shop_name)
from followers f JOIN
     users u
     ON f.user_id = u.id join
     updates up
     on up.user_id = f.user_id join
     shops s
     on up.shop_id = s.shop_id
where f.update > <whatever update time>
group by u.user_id

将这两个查询结合起来,这样就可以得到一个用户更新商店的列表?否则就颠倒顺序。首先获取用户列表,然后检查该用户的更新商店。@MarcB thanx,但我不能一次发送所有这些电子邮件,用户可能会达到数千人。循环所有用户不是一个好主意,但这就是重点。您将获得一个用户列表,然后为每个用户检查哪些商店是新的。您构建一封电子邮件,列出特定用户的商店,然后发送一封电子邮件。你的方法是好的,商店1。。。哪些用户在这台计算机上?发垃圾邮件!下一个商店2。发送更多垃圾邮件等。。。。除非您的查询需要非常长的时间才能运行,否则这将比每个用户发送一封电子邮件要高效得多,而不是更新的店铺*用户电子邮件。如果您不想在所有更新的店铺中循环,请在此时检索数量有限的店铺和用户。例如,您可以执行{}while$shopsRetrievedAmount,在这个循环中,检索当时的5个商店,在另一个这样的循环中检索当时的200个用户it@MarcB你说得很好,谢谢。