【问题标题】:Paginate while ignoring sub rows, with a Right Join在忽略子行的同时分页,使用右连接
【发布时间】:2013-05-08 14:13:52
【问题描述】:

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

程序 1
电子邮件 1、电子邮件 2、姓名、状态(第一个参与者)
电子邮件 1、电子邮件 2、姓名、状态(第二个参与者)
节目 2
电子邮件 1、电子邮件 2、姓名、状态(第一个参与者)

等...

基本查询:

$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());

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

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

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

任何帮助将不胜感激,如果我可以提供其他任何内容,请告诉我。

我不太关心使用相同的分页类,所以我对不同的方法完全持开放态度。

提前致谢

【问题讨论】:

    标签: php mysql join pagination right-join


    【解决方案1】:

    尝试使用子选择:

    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());
    

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

    【讨论】:

    • 谢谢,很遗憾我收到了这个错误:这个版本的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'
    • 感谢您的宝贵时间。我一直在努力让它工作,但我遇到了某种解析错误。黑屏。当我开始我的 while() 时,我正在循环访问 $query。请原谅潜在的愚蠢问题,但我应该将 Drop Table 和 Create Temp Table 查询命名为什么?其他一切似乎都应该起作用。再次感谢。
    • 得到解析。页面正在呈现,分页似乎正在工作,但没有显示任何行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多