更改复杂的内部联接查询并用PHP显示

更改复杂的内部联接查询并用PHP显示,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我有一个SQL查询,其中列出了本月付款的人和未付款的人: SELECT main.* FROM (SELECT t1.client_name, t1.total_debts, t2.client_id, sum(payment) payments , t2.date_now , CASE MONTH(t2.date_now) WHEN MONTH(CURDATE()) THEN 'Paid'

我有一个SQL查询,其中列出了本月付款的人和未付款的人:

SELECT  main.* 
FROM    (SELECT    t1.client_name, t1.total_debts, t2.client_id, sum(payment) payments , t2.date_now ,
                    CASE MONTH(t2.date_now)  
                       WHEN MONTH(CURDATE()) THEN 'Paid'
                       ELSE 'Not Paid'
                    END current_month
        FROM client_debts t1  INNER JOIN client_details t2  ON t1.id = t2.client_id 
        GROUP BY t2.client_id) main
WHERE   main.total_debts<> main.payments;
然后是HTML:

<div class="col-lg-6">
        <table>
        <?php foreach($res as $row){ ?>
        <tr>
        <td><?php echo $row['t1.client_name']; ?></td>
        </tr>
        <?php } ?>
        </table>
        </div>
但它一直在告诉我:

注意:C:\wamp\www中未定义的索引:id


可以通过在末尾的where子句中添加and条件来处理SQL问题。这是假设所有行都有权在该付款期限内付款。如果数据跨越多个月,那么我们需要另一个查询

SELECT  main.* 
FROM    (SELECT    t1.client_name, t1.total_debts, t2.client_id, sum(payment) payments , t2.date_now ,
                    CASE MONTH(t2.date_now)  
                       WHEN MONTH(CURDATE()) THEN 'Paid'
                       ELSE 'Not Paid'
                    END current_month
        FROM client_debts t1  INNER JOIN client_details t2  ON t1.id = t2.client_id 
        GROUP BY t2.client_id
        ) main
WHERE   main.total_debts<> main.payments
and current_month='Not Paid'
and client_name not in 
(select client_name from main 
where current_month='Paid'
);

因此,在这种情况下,该用户的付款列中应该包含哪些内容。50?不,只是显示他实际所在的行为什么这个客户端有两个不同的客户端ID?这个total_debts字段是什么?这些是来自client_details的ID,客户的主ID在名为client_debts的参考表中,这里的total debts是他在client_debts表中购买的每个项目的债务总额。我想这里有两个问题。1您是说您提供的SQL工作正常,还是希望在php中运行它,但由于给定错误而无法运行它。和2-您希望将查询更改为仅返回隐藏未付费行的付费用户。这意味着你的例子中有3行是正确的吗?好吧,它是有效的,但是当我将其更改为显示替换和main的未付款人列表。当前_月“未付款”;to和main.当月“已支付”;客户علي被列出,实际上,他不应该,因为,他实际上在本月早些时候为另一个项目支付了费用,PHP问题是solvedreplace condition to and main.current_month='paid',它会工作的,我想要的是,如果一个用户在本月为一个项目支付了费用,而没有为另一个项目支付费用,在支付的列表中只显示他的姓名,而“未付款”的名单应该只包括那些本月没有为任何一项付款的人。如果对你有效,那么答案就可以关闭。谢谢。@VolkerK我想他提供的所有查询数据都符合这项检查的条件。否则我们可能得想出更复杂的办法。
SELECT  main.* 
FROM    (SELECT    t1.client_name, t1.total_debts, t2.client_id, sum(payment) payments , t2.date_now ,
                    CASE MONTH(t2.date_now)  
                       WHEN MONTH(CURDATE()) THEN 'Paid'
                       ELSE 'Not Paid'
                    END current_month
        FROM client_debts t1  INNER JOIN client_details t2  ON t1.id = t2.client_id 
        GROUP BY t2.client_id
        ) main
WHERE   main.total_debts<> main.payments
and current_month='Not Paid'
and client_name not in 
(select client_name from main 
where current_month='Paid'
);