选择要在组中查看哪些数据

时间:2014-07-16 11:42:40

标签: php sql

昨天,我正在尝试按 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秒左右

但我需要知道更好的方法来做到这一点

抱歉奇怪的格式化,我是新来的......

2 个答案:

答案 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