正确加入发送每日通知电子邮件(PHP,Mysql)

时间:2011-05-04 14:55:21

标签: php mysql sql

我正在构建每日通知电子邮件脚本。

我需要将4个表连接到用户表,并且我需要在每个while ($user = mysql_fetch_array($result)){语句中使用user_email。

我能够使用带有1个表的外连接来实现此功能,但是在第一个表连接用完结果后,我无法使用不同的表来执行目标来执行目标。我希望mysql查询获取内容,直到第一个连接用完(对于每个用户),然后开始显示第二个连接查询的数据(所有在while循环中执行)。这是可能的,如果是这样,语法是什么?

现有代码:

$sql = "SELECT * 
          FROM users
    OUTER JOIN contest_entries ON contest_entries.email = users.email ";    

$result = mysql_query($sql) or die (mysql_error()); 

我要附加的第二个查询是获得所有新的竞赛。

$sql = "SELECT * 
          FROM contests";

因此,对于每个用户,我希望显示适用于它们的每个contest_entries字段,然后显示适用于它们的每个contests字段。

注意:为了节省处理能力/时间,我可能只是将所有竞赛存储在一个字符串中,然后将它们添加到每个电子邮件中,但我想用这个例子来找到正确的多重连接技术。

1 个答案:

答案 0 :(得分:2)

$sql = "SELECT * 
        FROM users
          LEFT JOIN contest_entries
            ON contest_entries.email = users.email
          JOIN contests
            ON contests.id = contest_entries.contestid
        ORDER BY users.email                 --- or whatever other order you need
               , contest.id ";    

然后,您可以在已经按用户和竞赛排序(并分组)的结果集上迭代PHP。


如果您还没有任何方式将userscontests联系起来,我猜您仍在设计应用程序和数据库结构。您可以使用它来显示与所有竞赛相关的用户,然后在WHERE子句中尝试应用条件。:

$sql = "SELECT * 

        FROM users
          LEFT JOIN contest_entries
            ON contest_entries.email = users.email
          CROSS JOIN contests

        WHERE ( contests.started >= NOW() - interval 3 day )   --- new contests
          AND ( users.age <= contests.agelimit )               
          AND ( some other condition )                         

        ORDER BY users.email                 --- or whatever other order you need
               , contest.id " ;