昨天,我正在尝试按 Group by 制作的小组对数据进行排序
我必须选择要在这些组中显示的数据
有债务清单,每个人过去可能有债务,但从未有超过1个未付债务
我需要知道每个用户在最后一次债务之前还欠了多少次债务。
这是数据库中的列
表"用户"
uid |名字|出生日期
表"债务"
uid | debt_duration | paid_count | CREATED_DATE
我最终在php
中遇到了这样的黑客攻击$res = mysql_query( "
SELECT * FROM Debt
JOIN Users
WHERE Users.uid = Debt.uid
ORDER BY created_date
GROUP BY Debt.uid");
while( $row = mysql_fetch_array( $res ) ){
$uid = $row['uid'];
$r = mysql_fetch_array( mysql_query("SELECT COUNT(*) FROM Debt WHERE uid = $uid") );
$previous_debts_count = $r[0];
}
这个剧本很重,但幸运的是我的客户并没有抱怨。
该脚本运行在3秒左右
但我需要知道更好的方法来做到这一点
答案 0 :(得分:0)
我认为您想要的查询是:
SELECT Users.uid, COUNT(*) as cnt
FROM Debt JOIN
Users
ON Users.uid = Debt.uid
GROUP BY Debt.uid
ORDER BY created_date ;
只需遍历结果,不要为此使用多个查询。检查Users.uid
是否是users表上的主键。并在debt(uid)
上添加索引以提高效果。
答案 1 :(得分:0)
首先,您应该永远在SQL语句中使用* 它使查询极易受到SQL注入的攻击。</ p>
我建议您使用PDO或PHP框架。
试试这个:
SELECT COUNT(Debt.uid) AS users
FROM Debt
LEFT JOIN Users
ON Users.uid = Debt.uid
GROUP BY Debt.uid