2016-04-12 32 views
1

我需要建立一個結構如下報告:SQL:查詢同一列多次AS不同的列,具有多個值回到1元

名稱,Field_1,Field_2,Field_3

吉姆, opt_1,Y,12

簡,opt_2,N,64

諸如此類

我從Moodle的數據庫表拉,在以下所示的圖像結構秒。 mdl_user_info_data,mdl_user_info_field,mdl_user與其他列具有相同的列,我從它得到的所有名稱都是名稱,所以我不打擾將它包括在此處。這部分工作正常。

這是我能想出迄今最好的,所以你可以看到表如何加入:

SELECT 
CONCAT (u.firstname, u.lastname) Name, 
(SELECT d.data FROM mdl_user_info_data d JOIN mdl_user_info_field f ON f.id = d.fieldid WHERE f.shortname = "Field_1" GROUP BY d.userid), 
(SELECT d.data FROM mdl_user_info_data d JOIN mdl_user_info_field f ON f.id = d.fieldid WHERE f.shortname = "Field_2" GROUP BY d.userid), 
(SELECT d.data FROM mdl_user_info_data d JOIN mdl_user_info_field f ON f.id = d.fieldid WHERE f.shortname = "Field_3" GROUP BY d.userid), 

FROM mdl_user u 
JOIN mdl_user_info_data d ON d.userid = u.id 
JOIN mdl_user_info_field f ON d.fieldid = f.id 
GROUP BY d.userid 
ORDER BY `Name` ASC 

我知道我找錯了樹,我的子查詢,但不知道該怎麼做,以取代GROUP BYs。我當前的查詢將每一行中返回每個給定Field_x的所有值,當我只需要返回對應於第1列

任何幫助非常讚賞指定的用戶價值。

+0

結果爲了更加清晰:我知道我可以做「GR​​OUP_CONCAT(d .data ORDER BY d.userid)「Field_1,Field_2,Field_3」,'但是項目規範要求每個字段有單獨的列,而不是單個逗號分隔的連續列。我希望! – elBarfo

回答

1

我對moodle或它的sql語法並不積極,但如果共同的話,您可以通過多次對錶進行左連接,每次使用它的條件限定,然後使用不同的ALIAS引用讓你的作品......

SELECT 
     CONCAT (u.firstname, u.lastname) Name, 
     dFld1.Data as Field1Data, 
     dFld2.Data as Field2Data, 
     dFld3.Data as Field3Data 
    FROM 
     mdl_user u 
     LEFT JOIN mdl_user_info_data dFld1 
      ON u.id = dFld1.userid 
      LEFT JOIN mdl_user_info_field fFld1 
       ON dFld1.fieldid = fFld1.id 
       AND fFld1.shortname = "Field_1" 
     LEFT JOIN mdl_user_info_data dFld2 
      ON u.id = dFld2.userid 
      LEFT JOIN mdl_user_info_field fFld2 
       ON dFld2.fieldid = fFld2.id 
       AND fFld2.shortname = "Field_2" 
     LEFT JOIN mdl_user_info_data dFld3 
      ON u.id = dFld3.userid 
      LEFT JOIN mdl_user_info_field fFld3 
       ON dFld3.fieldid = fFld3.id 
       AND fFld3.shortname = "Field_3" 
    ORDER BY 
     `Name` ASC 

我有這個疑問與左JOIN的,如果任何這樣的鏈接可能不會有一個值。

至於組通過,這將僅當有一個或多個用於分別給定用戶和字段1,2或3項的基礎表的多個條目必需的。

+0

完美工作。謝謝!如果您有任何最喜歡的SQL學習資源,我也對這些建議持開放態度。 – elBarfo

0

另一種解決方案。

SELECT u.id, u.firstname, u.lastname, f.fieldname1, f.fieldname2 
FROM mdl_user u 
JOIN (
    SELECT d.userid, 
     MAX(CASE WHEN f.shortname = 'fieldname1' THEN d.data ELSE null END) AS fieldname1, 
     MAX(CASE WHEN f.shortname = 'fieldname2' THEN d.data ELSE null END) AS fieldname2 
    FROM mdl_user_info_field f 
    JOIN mdl_user_info_data d ON d.fieldid = f.id 
    WHERE f.shortname IN ('fieldname1', 'fieldname2') 
    GROUP BY d.userid) f ON f.userid = u.id 

的毗連將爲MySQL的工作,但你應該使用數據庫兼容的功能 - https://docs.moodle.org/dev/Data_manipulation_API#SQL_compatibility_functions

所以使用的

$DB->sql_concat('u.firstname', 'u.lastname');