兩個建議:
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語法 –