我目前正在使用Laravels 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,因此当应该为80时,将打开480个票据。
/ **编辑** /
-- ----------------------------
-- 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行。
答案 0 :(得分:0)
这里有一个非常好的答案Why do the results of this MySQL query get multiplied by each other?让我朝着正确的方向前进。
在我的方案中,对于组织中的每个用户都将执行COUNT()
。问题是,如果我有6个用户属于一个组织,那么它将运行COUNT()
语句六次。
回到我的查询,我不需要用户表。这是无关紧要的,因为我只是试图访问带票和组织的组织。组织名称 - 所有这些名称都存储在tickets
& tickets_statuses
个表格。这给我留下了一个有效的查询:
return DB::table('tickets')
->leftjoin('tickets_statuses', 'tickets.ticket_id', '=', 'tickets_statuses.ticket_id')
->select('tickets.organisation', DB::raw('COUNT(tickets.ticket_id) as tickets'))
->where('tickets_statuses.status_id', 0)
->groupby('tickets.organisation')
->havingRaw('COUNT(tickets.ticket_id) > 1')
->get();
感谢所有回复的人!