【问题标题】:Mysql query running COUNT every time the same value is fetched每次获取相同的值时运行 COUNT 的 Mysql 查询
【发布时间】: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


【解决方案1】:

Why do the results of this MySQL query get multiplied by each other? 这里有一个很好的答案,让我朝着正确的方向前进。

在我的场景中,对于组织中的每个用户,COUNT() 都会被执行。问题是,如果我有 6 个用户属于一个组织,它将运行 COUNT() 语句六次。

所以回到我的查询,我不需要用户表。这无关紧要,因为我只是试图通过票证和组织名称访问组织 - 所有这些都存储在 ticketstickets_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();

感谢所有回复的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2015-10-04
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多