2014-08-27 144 views
0

場景:
我需要選擇20個用戶與他們的所有信息,還可以選擇與他們所教的語文老師的個人資料。我試圖做到這一點,但似乎MySQL只返回一個值的數組沒有嵌套的數組值,有沒有辦法做到這一點?MySQL的 - 從表中選擇所有從另一個表中選擇相關行

表:

+------------------------------------------+ 
|     users     | 
+------------------------------------------+ 
| id | firstname |  email  | 
+------------------------------------------+ 
| 18 |  Tom  | [email protected] | 
+------------------------------------------+ 
| 30 | Jerry | [email protected]  | 
+------------------------------------------+ 
| 25 | Butch | [email protected] | 
+------------------------------------------+ 

+------------------------------------+ 
|    teachers    | 
+------------------------------------+ 
| id | user_id | trial_lessons | 
+------------------------------------+ 
| 10 | 18  |  yes  | 
+------------------------------------+ 
| 26 | 30  |  no  | 
+------------------------------------+ 
| 28 | 25  |  no  | 
+------------------------------------+ 

+------------------------------------------+ 
|   teacher_languages    | 
+------------------------------------------+ 
| id | teacher_id | language_text_id | 
+------------------------------------------+ 
| 16 |  10  |   6   | 
+------------------------------------------+ 
| 40 |  10  |   8   | 
+------------------------------------------+ 
| 16 |  28  |   6   | 
+------------------------------------------+ 
| 16 |  28  |  10   | 
+------------------------------------------+ 
| 16 |  26  |   6   | 
+------------------------------------------+ 

+-------------------+ 
|  languages  | 
+-------------------+ 
| id | language | 
+-------------------+ 
| 6 | English | 
+-------------------+ 
| 8 | French | 
+-------------------+ 
| 10 | Spanish | 
+-------------------+ 

到目前爲止我的代碼

SELECT 
    users.*,   
    nationality.country AS country_of_nationality, 
    residence.country AS country_of_residence, 
FROM 
    users 
LEFT JOIN 
    text_countries AS nationality 
ON 
    users.nationality = nationality.iso_code_2 
AND 
    nationality.language_id = ? 
LEFT JOIN 
    text_countries AS residence 
ON 
    users.residence_country = residence.iso_code_2 
AND 
    residence.language_id = ? 
ORDER BY 
    users.created_at 
DESC LIMIT 
     20 

預期成果

[0] => 
    [user_id] => 18 
    [firstname] => 'Tom' 
    [teacher_id] => 10 
    [languages] => 
       [language] => 'English' 
       [language] => 'French' 
[1] => 
    [user_id] => 30 
    [firstname] => 'Jerry' 
    [teacher_id] => 26 
    [languages] => 
       [language] => 'English' 
[2] => 
    [user_id] => 25 
    [firstname] => 'Butch' 
    [teacher_id] => 28 
    [languages] => 
       [language] => 'English' 
       [language] => 'Spanish' 
+0

向我們展示您的代碼,請在尋求幫助之前親自嘗試一下。 – Adam 2014-08-27 22:40:21

+0

MySQL不返回多維記錄。每個記錄都是一維的。大多數關係數據庫都是這樣做的。您可以使用'GROUP_CONCAT'將多個值收集到1列中,具體取決於您需要的語言數據。 – Rudie 2014-08-27 22:41:06

+0

我已經做了,我迄今爲止的代碼非常長,因爲它從多個表計算,如果它大部分是代碼,它不會讓我發佈問題。乾杯! – CupOfJoe 2014-08-27 22:41:39

回答

0

的MySQL沒有按」 t返回多維記錄。每個記錄都是一維的。大多數關係數據庫都是這樣做的。

你可以使用GROUP_CONCAT收集多個值到1列,雖然,這取決於你如何需要的語言數據:

SELECT stuff, GROUP_CONCAT(l.language) AS languages 
FROM users u 
JOIN teachers t ON .... 
JOIN teacher_languages tl ON .... 
JOIN languages l ON .... 
GROUP BY u.id 

我假設你知道(和有嗎?)的JOIN小號...您需要一個額外的JOIN(多個)至teacher_languages,然後再使用另一個JOIN(單個)至languages,然後使用GROUP_CONCAT將多個語言記錄收集爲1個值。

+0

我嘗試了你的建議,它很好地工作,現在的問題是它返回一個用戶的信息的單個值,並連接所有可用的語言進入它。 – CupOfJoe 2014-08-27 23:23:49

+0

我錯過了'GROUP BY u.id',它讓我感到困惑,就像你在代碼中寫的那樣,爲什麼你這樣寫呢? – CupOfJoe 2014-08-27 23:32:55

+0

我不知道=)我想我可以只說'GROUP BY u.id' ...我改變了答案。對不起,不太清楚。它現在工作嗎? – Rudie 2014-08-28 10:22:23

相關問題