2011-05-04 61 views
0

我正在构建每日通知电子邮件脚本。正确加入发送每日通知电子邮件(PHP,Mysql)

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

我能够得到这个与一个表的外连接一起工作,但是我在第一个表连接结束后没有得到执行带有不同表的目标的语法的语法。我希望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是适用于他们。

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

+0

的是'LEFT OUTER JOIN'和'RIGHT OUTER JOIN'在SQL。但不(仅)'外部连接'。 – 2011-05-04 15:24:36

+0

@Bob:你不假设有人会猜测你的4表结构是什么,对吧? – 2011-05-04 15:33:33

+0

我认为stackoverflow用户是很好的猜测者。但是,真的,我真的想看到这三个例子,所以我有一个想法如何将它应用到其余的表格。 – 2011-05-04 15:36:48

回答

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 " ;  
+0

嘿 - 几乎在那里,除了没有加入比赛的关键,我们正在获得所有比赛 – 2011-05-04 15:45:36

+0

那么,我不能再猜测了。张贴表格和他们的领域,我们可以建议添加或改变结构在'比赛'和'contest_enties'中应该有一个共同的字段,所以这两个表可以在查询中相关联 – 2011-05-04 15:50:36

+0

这种连接语法限制比赛,它应该加入所有比赛 - 可能连接不正确的语法? – 2011-05-04 16:11:08