【发布时间】:2015-08-27 18:17:09
【问题描述】:
我目前正在使用 Laravel QueryBuilder 来获取所有用户以及他们拥有的开放票证的数量。
查询如下所示:
return DB::table('users')
->leftjoin('tickets', 'users.organisation', '=', 'tickets.organisation')
->leftjoin('tickets_statuses', 'tickets.ticket_id', '=', 'tickets_statuses.ticket_id')
->select(
'users.organisation',
DB::raw('COUNT(tickets.ticket_id) as tickets')
)
->where('tickets_statuses.status_id', 0)
->where('users.admin', false)
->groupby('users.organisation')
->get();
问题是,我可能有 6 个用户属于同一个组织。因此,如果 80 个开放票属于该组织,则查询将执行 80 x 6 出于某种原因导致 480 个开放票计数应该是 80。
/** 编辑 **/
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
`organisation` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`parent_account` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`admin` tinyint(1) NOT NULL,
`remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=50 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+----+---------------------------+-------------------------------------+---------------------------------+
| id | name | email | organisation |
+----+---------------------------+-------------------------------------+---------------------------------+
| 6 | Bruce Mayert MD | Hodkiewicz.Nicolette@gmail.com | Corkery Group |
| 30 | Mr. Willard Bogisich III | Rowena13@gmail.com | Corkery Group |
| 31 | Jacinthe Murphy | Schuyler57@Pfeffer.org | Corkery Group |
| 32 | Zelda Koss PhD | iTillman@Spinka.biz | Corkery Group |
| 33 | Mr. Kevon McCullough MD | kMarks@Green.org | Corkery Group |
| 34 | Prof. Cleveland Prohaska | Ibrahim.Schneider@hotmail.com | Corkery Group |
如您所见,多个用户属于一个组织。现在,如果我运行以下查询:
SELECt ticket_id from tickets where organisation = 'Corkery Group';
我收到以下信息:
80 rows in set (0.00 sec)
从查询中,我想获取组织名称并计算属于某个组织的所有票证。
当我运行原始查询时,它会返回 480 行的结果集,而它应该只返回 80 行。
【问题讨论】:
-
你应该使用缓存
-
稍后
COUNT(tickets.organisation) as tickets和->groupby('users.organisation', 'tickets.organisation')是什么意思?我的猜测是:您应该从 groupby 中删除tickets.organisation。所以它可能只是:->groupby('users.organisation') -
@Alex 感谢您的回答。我已将其更新为
COUNT(tickets.ticket_id) as tickets- 该语句仅计算每个用户的未结门票。不幸的是,只有groupby('users.organisation')仍然返回相同的结果。 -
请发布您的数据库架构、原始数据样本和预期结果
-
@Alex 我已经更新了我的问题。
标签: php mysql laravel laravel-5.1