Paginate而忽略子行,右键加入

时间:2013-05-08 14:13:53

标签: php mysql join pagination right-join

我有这个基本查询返回程序标题的主要行(eventdesc),然后将程序参与者和信息列为多个子行。

计划1
电子邮件1,电子邮件2,姓名,状态(第一位参与者)
电子邮件1,电子邮件2,姓名,状态(第二参与者)
计划2
电子邮件1,电子邮件2,姓名,状态(第一位参与者)

... ETC

基本查询:

$query_perpage = "SELECT COUNT(*) FROM camps_events";
$result = mysql_query($query_perpage, $db) or die(mysql_error());
$r = mysql_fetch_row($result);
$numrows = $r[0];


$pages = new Paginator($query);
$pages->items_total = $numrows;
$pages->paginate();
$pages->mid_range = 7;


$query = mysql_query("SELECT ce.eventcode, ce.eventdesc, ce.date, r.participant_fname, r.participant_lname, 
r.position, r.dob, r.status, r.email_primary, r.order_number 
FROM camps_events ce 
RIGHT JOIN registrations r on r.eventcode = ce.eventcode 
WHERE ce.reg_status = 'Active' 
AND r.status NOT IN ('Incomplete','Canceled')".getAllowedPrograms()." 
ORDER BY ce.eventdesc, ce.eventcode, r.participant_lname ASC $pages->limit ") or die(mysql_error());

我一直试图弄清楚如何通过程序对它进行分页,无论有多少个子行。 我在另一个页面上有一个分页类,但只从一个表中提取。

我一直在尝试实现相同的分页,但我只能将它拉到第一个程序,然后它根据子行限制页面,而不是主程序行。在我在这里发布的状态中,每个后续页面仅显示第一个程序。每个页面上出现的子行不同,但我不知道它们是否都在第一个程序中。

该查询可以正常地提取所有结果,但如果它是一个巨大的列表,它的效率非常低,甚至可以超时浏览器。

如果我能包含任何其他内容,请与我们联系。

我并不太关心使用相同的分页类,所以我完全接受不同的方法。

提前致谢

1 个答案:

答案 0 :(得分:0)

尝试使用子选择:

SELECT ce.eventcode, ce.eventdesc, ce.date, r.participant_fname, r.participant_lname, 
    r.position, r.dob, r.status, r.email_primary, r.order_number 
FROM camps_events ce 
RIGHT JOIN registrations r on r.eventcode = ce.eventcode 
WHERE ce.reg_status = 'Active' 
    AND r.status NOT IN ('Incomplete','Canceled')".getAllowedPrograms()." 
    AND ce.id in (select id from camps_events pgce order by ce.eventdesc, ce.eventcode $pages->limit)
ORDER BY ce.eventdesc, ce.eventcode, r.participant_lname ASC ") 
or die(mysql_error());

编辑:遗憾的是MySQL还不能限制子查询。 :-( 所以它必须是一个临时表:

mysql_query("drop temporary table if exists tmp_events", $db);
mysql_query("create temporary table tmp_events select id from camps_events order by eventdesc, eventcode " . $pages->limit, $db);

mysql_query("SELECT ce.eventcode, ce.eventdesc, ce.date, r.participant_fname, r.participant_lname, 
    r.position, r.dob, r.status, r.email_primary, r.order_number 
FROM camps_events ce 
inner join tmp_events pgce on pgce.id = ce.id
RIGHT JOIN registrations r on r.eventcode = ce.eventcode 
WHERE ce.reg_status = 'Active' 
    AND r.status NOT IN ('Incomplete','Canceled')".getAllowedPrograms()." 
ORDER BY ce.eventdesc, ce.eventcode, r.participant_lname ASC ") 
or die(mysql_error());

当然可以有页面少于分页项目的页面,因为没有注册的事件将不会显示。

相关问题