我可能需要一些建议。
任务是从MySQL数据库表中生成一些统计信息。我使用条令DBAL类进行查询。
因此,我们在这里有两个表(作为示例减少):
USERS表格
user_id | user_name | user_gender |。。。---------------------------------------1234|Klark Kent|1|。。。2468|Lex Luthor|1|。。。3579|路易斯巷|2|。。。。。。。
CHECKINS表
checkin_id | checkin_user_id | checkin_month|。。。--------------------------------------------------1|1234|1|。。。2|2468|1|。。。3|1234|1|。。。4|1234|2|。。。。。。。
统计结果最终应该是这样的:
月份|全部|男性|女性|唯一------------------------------------1月| 312 | 179 | 133 | 2242月| 295 | 169 | 135 | 2183月| 301 | 154 | 147 | 230。。。。
所以基本上我是这样做的:
for ($i = 1; $i <= 12; $i++) {
$QB = $DB->createQueryBuilder();
$STMT = $QB
->select('c.checkin_id')
->from(CHECKIN_TABLE, 'c')
->innerJoin('c', USER_TABLE, 'u', 'c.checkin_user_id = u.user_id')
->where('u.user_gender = 1')
->andWhere('c.checkin_month = :month')
->setParameter('month', (int)$i)
->execute();
;
$stats[$i]['male'] = $STMT->rowCount();
$QB = $DB->createQueryBuilder();
$STMT = $QB
->select('c.checkin_id')
->from(CHECKIN_TABLE, 'c')
->innerJoin('c', USER_TABLE, 'u', 'c.checkin_user_id = u.user_id')
->where('u.user_gender = 2')
->andWhere('c.checkin_month = :month')
->setParameter('month', (int)$i)
->execute();
;
$stats[$i]['female'] = $STMT->rowCount();
$stats[$i]['all'] = $stats[$i]['male']+$stats[$i]['female'];
$QB = $DB->createQueryBuilder();
$STMT = $QB
->select('DISTINCT checkin_user_id')
->from(CHECKIN_TABLE, 'c')
->where('checkin_month = :month')
->setParameter('month', (int)$i)
->execute();
;
$stats[$i]['unique'] = $STMT->rowCount();
}
正如您所看到的,我在12次循环中运行3个查询。由于问题相对简单,这可能还可以,但如果可以做得更好,我很高兴听到你的意见?
也许选择所有条目,然后用大量IF子句执行WHILE Fetch循环?
if ( ($row['checkin_month'] == 1) && ( $row['user_gender'] == 1 ) $stats[1]['male']++;
if ( ($row['checkin_month'] == 1) && ( $row['user_gender'] == 2 ) $stats[1]['female']++;
if ( ($row['checkin_month'] == 2) && ( $row['user_gender'] == 1 ) $stats[2]['male']++;
if ( ($row['checkin_month'] == 2) && ( $row['user_gender'] == 2 ) $stats[2]['female']++;
当我们来到这里时,还有一个问题。我读到使用DISTINCT删除重复条目不是最佳做法,但我不知道如何才能做到这一点。我读过关于WHERE EXISTS的文章,但这不起作用,因为我只在这里查询一个表来进行DISTINCT调用。
如果你有任何提示或想法,请告诉我。谢谢大家。
幸运的是,我在阅读和搜索了很多东西后,自己找到了一个解决方案。
因此,对于每个可能有类似任务的人来说,下面是如何用一个查询完成任务的方法
(然而,我不知道如何使用查询生成器来构建它,但它可以作为SQL语句工作。)
$SQL = 'SELECT
c.checkin_month, count(*) AS count,
count(DISTINCT c.checkin_member_id) AS uniq,
sum(case when u.user_gender = 1 then 1 else 0 end) AS male,
sum(case when u.user_gender = 2 then 1 else 0 end) AS female
FROM
'.CHECKIN_TABLE.' c,
'.USER_TABLE.' u
WHERE
c.checkin_user_id = u.user_id
GROUP BY
c.checkin_month';
$res = $DB->fetchAll($SQL);
所以更少的代码,更少的查询,同样的结果。