左联接会导致异常大的查询结果

时间:2020-08-30 16:20:46

标签: php laravel

我正在制作一个Web应用程序功能,以将记录从数据库导出到.csv文件。我使用StreamedResponse和array_chunk来为此流记录,因为我提取行的表相当大。但是,由于在我的查询构建器中实现的左联接,旧记录的结果变得肿,因此导出该文件时遇到了困难。

下面的代码段是我从 ticket 表中获取旧票据的查询,这将导致 3990 行。 (注意::我已经在表中的最新票据上尝试了下面的代码段,并且下面提到的两个查询的结果之间没有差异。)

$tickets_data = DB::table('ticket')
            ->select('ticket.tn', 'ticket.create_time as ticket_create_time', 'ticket.change_time as ticket_closed_time', 'ticket.title', 'ticket.ticket_state_id as state_id', 'ticket_history.create_time as history_create_time', 'ticket_state.name as state_name', 'ticket_priority.name as priority_name', 'queue.name as queue_name', 'ticket_index.s_lock', 'users.first_name as user_fname', 'users.last_name as user_lname', 'users.login as user_login', 'customer_user.first_name as cust_id', 'customer_user.first_name as cust_fname', 'customer_user.last_name as cust_lname', 'article.a_from')
            ->join('ticket_history', 'ticket.id', '=', 'ticket_history.ticket_id')
            ->join('ticket_state', 'ticket.ticket_state_id', '=', 'ticket_state.id')
            ->join('ticket_priority', 'ticket.ticket_priority_id', '=', 'ticket_priority.id')
            ->join('queue', 'ticket.queue_id', '=', 'queue.id')
            ->leftJoin('ticket_index', 'ticket.id', '=', 'ticket_index.ticket_id')
            ->leftJoin('customer_user', 'ticket.customer_id', '=', 'customer_user.customer_id')
            ->join('users', 'ticket.user_id', '=', 'users.id')
            ->join('article', 'ticket.id', '=', 'article.ticket_id')
            ->where('ticket.id', 315)
            ->orderBy('ticket.id')
            ->get()
            ->toArray();

从选择项和'customer_user.first_name as cust_id', 'customer_user.first_name as cust_fname', 'customer_user.last_name as cust_lname'中删除->leftJoin('customer_user', 'ticket.customer_id', '=', 'customer_user.customer_id')会将其缩小为 114

想知道如何使结果变小,我对一些查询进行了实验,发现执行与 ticket customer_user中的customer_id相匹配的查询表(在这种情况下为customer_id=003**********)将为我提供 35行的结果。

Query result

我已经阅读了一些有关左联接如何工作的信息,并且从这个answer开始,这应该是预期的行为,因为我正在联接具有相同customer_id的表。据我了解,如果情况并非如此,则期望的输出将是右列( customer_user )中的空值。我想获得下图所示的114行的先前结果,但使用'customer_user.first_name', 'customer_user.first_name''customer_user.last_name'

enter image description here

我尝试的一种解决方案是在查询中添加groupBy子句。

$tickets = DB::table('ticket')
            ->select('ticket.tn', 'ticket.create_time as ticket_create_time', 'ticket.change_time as ticket_closed_time', 'ticket.title', 'ticket.ticket_state_id as state_id', 'ticket_history.create_time as history_create_time', 'ticket_state.name as state_name', 'ticket_priority.name as priority_name', 'queue.name as queue_name', 'ticket_index.s_lock', 'users.first_name as user_fname', 'users.last_name as user_lname', 'users.login as user_login', 'article.a_from') 
            ->join('ticket_history', 'ticket.id', '=', 'ticket_history.ticket_id')
            ->join('ticket_state', 'ticket.ticket_state_id', '=', 'ticket_state.id')
            ->join('ticket_priority', 'ticket.ticket_priority_id', '=', 'ticket_priority.id')
            ->join('queue', 'ticket.queue_id', '=', 'queue.id')
            ->leftJoin('ticket_index', 'ticket.id', '=', 'ticket_index.ticket_id')
            ->leftJoin('customer_user', 'ticket.customer_id', '=', 'customer_user.customer_id')
            ->join('users', 'ticket.user_id', '=', 'users.id')
            ->join('article', 'ticket.id', '=', 'article.ticket_id')
            ->where('ticket.id', 315)
            ->orderBy('ticket.id')
            ->groupBy('ticket.id', 'ticket_history.create_time', 'ticket_index.s_lock', 'customer_user.first_name', 'customer_user.last_name', 'article.a_from')
            ->get();

这将我的结果减少到仅62,但是与我之前运行的上一个查询相比,当我尝试从单个故障单中导出记录时,这要慢得多。现在,我正在考虑添加另一个where子句以按年份对其进行过滤,这对我来说没有意义,但可以帮助部分保存此子句。如果您对我在哪里可以找到有关我的问题或与此有关的任何问题的其他信息有任何建议,我将非常感谢。

0 个答案:

没有答案