【发布时间】:2011-10-24 05:07:15
【问题描述】:
SELECT a.tag,CONCAT(u.first_name,' ',u.last_name)
FROM assets a
LEFT JOIN (SELECT asset_id,assigned_to_id
FROM asset_activity
WHERE assigned IN (SELECT MAX(assigned)
FROM asset_activity
GROUP BY asset_id))
v ON v.asset_id = a.id
LEFT JOIN users u ON v.assigned_to_id = u.id
WHERE ($1 IS NULL OR u.last_name LIKE $1)
由于 MySQL 在子查询上的左连接性能非常糟糕,我需要找到一些其他方法来做到这一点。我可以通过选择中的子查询来选择我需要的内容,但它必须是有条件的。它应该只返回与 LIKE 匹配的记录,并且对于子查询,它仍会从资产中返回一条为 assignment_to 为空值的记录,所以我不能这样做。
执行计划:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY a ALL null null null null 1,447
1 PRIMARY <derived2> ALL null null null null 1,396
1 PRIMARY u eq_ref PRIMARY PRIMARY 4 v.assigned_to_id 1
2 DERIVED asset_activity ALL null null null null 1,400 Using where
3 DEPENDENT SUBQUERY asset_activity index null asset_id 4 null 1,400 Using filesort
索引:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
assets 0 PRIMARY 1 id A 144 "" BTREE ""
assets 1 serial 1 serial A 1447 YES BTREE ""
assets 1 serial 2 cal_num A 1447 YES BTREE ""
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
asset_activity 0 PRIMARY 1 id A 1400 "" BTREE ""
asset_activity 1 asset_id 1 asset_id A "" BTREE ""
asset_activity 1 location_id 1 location_id A YES BTREE ""
asset_activity 1 assigned_to_id 1 assigned_to_id A YES BTREE ""
asset_activity 1 assigned_to_table 1 assigned_to_table A YES BTREE ""
asset_activity 1 created 1 created A "" BTREE ""
【问题讨论】:
-
请提供表架构、索引、执行计划结果
-
我不知道如何在此处格式化该数据以使其可读..
-
什么是
asset_activity.assigned? -
资产分配的日期。活动表是一个子项,每当资产移动到另一个位置或另一个用户时,它都会写入一条新记录,并且我将加入它以记录该资产的最大分配日期,并过滤用户的姓氏记录
标签: mysql join conditional subquery