更改复杂的内部联接查询并用PHP显示
我有一个SQL查询,其中列出了本月付款的人和未付款的人:更改复杂的内部联接查询并用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'
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'
);