2017-03-27 144 views
0

我試圖將兩個表一起樞軸顯示後端用戶信息在我的WordPress站點的管理員只有部分,並且不能通過錯誤「MySQL說:'on子句'中的未知列'u.ID'」 數據結構是正確的,但我似乎無法超越這一點。Wordpress- MySQL說:'未知列'users.ID'在'條款'

select u.ID as name, 
um.* 
from users as u, usermeta as um 
join (
    select um.umeta_id, 
    max(case when meta_key='nickname' then meta_value end)as nickname, 
    max(case when meta_key='first_name' then meta_value end)as first_name 
    from usermeta as um 
    group by um.umeta_id) 
um on u.ID=um.umeta_id 
+2

不要混合,(舊連接語法)和JOIN語法 –

回答

0

兩個建議:

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

這些子查詢要由外部查詢返回的每行執行,因此,那些能真正陷入癱瘓的性能,如果我們返回很多行。

+0

完美的作品,謝謝! –

+0

對不起,它爲我提供了有關用戶表中第一個結果ID的良好數據,但它並未完成所有行。 –

+0

此答案中的查詢應該從用戶表中返回*每*行,以及在usermeta表中找到匹配的暱稱和名字。當找不到匹配的行時,暱稱和first_name將爲NULL。 (umeta_id列的命名對於引用users(id)的外鍵有點奇怪,umeta_id列是否包含來自用戶的id值?這是否是正確的連接條件?在此的連接謂詞查詢是從原始查詢中複製的......我沒有任何示例數據,我所擁有的唯一規範是問題中的錯誤SQL。) – spencer7593