每次获取相同的值时,Mysql查询运行COUNT

时间:2015-08-27 18:17:10

标签: php mysql laravel laravel-5.1

我目前正在使用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行。

1 个答案:

答案 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();

感谢所有回复的人!