两个建议:
1)不要混合老派的逗号连接语法与新JOIN关键字语法
2)使表的别名一份声明中唯一(唐”牛逼重用um
别名)
我不认为我们需要两个连接到usermeta表。我怀疑,我们是想返回一个结果一样,将由该查询返回的一个:
SELECT u.id AS name
, m.nickname AS nickname
, m.first_name AS first_name
FROM users u
LEFT
JOIN (SELECT um.umeta_id
, MAX(CASE WHEN um.meta_key='nickname' THEN um.meta_value END) AS nickname
, MAX(CASE WHEN um.meta_key='first_name' THEN um.meta_value END) AS first_name
FROM usermeta um
GROUP
BY um.umeta_id
) m
ON m.umeta_id = u.id
ORDER BY u.id
这只是一个猜测。如果没有规范,或者示例数据和预期结果,我们只是在猜测。
随访
作为替代的加入,我们可以在选择列表中使用相关子查询。例如:
SELECT u.id AS name
, (SELECT umn.meta_value
FROM usermeta umn
WHERE umn.umeta_id = u.id
AND umn.meta_key='nickname'
ORDER BY umn.meta_value DESC
LIMIT 1
) AS nickname
, (SELECT umn.meta_value
FROM usermeta umn
WHERE umn.umeta_id = u.id
AND umn.meta_key='first_name'
ORDER BY umn.meta_value DESC
LIMIT 1
) AS first_name
FROM users u
ORDER BY u.id
对于外部查询返回的行合理数量的,我们可以得到合理的表现,只要我们有usermeta表中定义合适的索引,领先的(umeta_id,meta_key)
列。理想的覆盖指数也包括meta_value
。
这些子查询要由外部查询返回的每每行执行,因此,那些能真正陷入瘫痪的性能,如果我们返回很多行。
不要混合,(旧连接语法)和JOIN语法 –