2014-08-27 4 views
0

시나리오 : 내가 모든 정보 (20) 사용자를 선택하고 또한 그들이 가르치는 모든 언어로 자신의 교사 프로필을 선택해야
. 나는이 일을하려고하지만 그것은 mysql 경우에만 값 중첩 된 배열을 사용하여 값 배열을 반환하는 것, 그것을 할 방법이 무엇입니까?MySQL의 - 테이블에서 모든 선택하고 다른 테이블에서 관련 행을 선택

테이블 :

MY 코드

+------------------------------------------+ 
|     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 | 
+-------------------+ 
는 SO FAR

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

+0

MySQL은 다차원 레코드를 반환하지 않습니다. 모든 기록은 1-D입니다. 대부분의 관계형 DB는 그렇게합니다. 언어 데이터가 필요한 방식에 따라 여러 값을 1 열로 수집하려면 GROUP_CONCAT을 사용할 수 있습니다. – Rudie

+0

나는 이미했는데, 지금까지 가지고있는 코드는 여러 테이블에서부터 계산 되었기 때문에 매우 길다. 그리고 대부분이 코드라면 질문을 게시하지 않을 것이다. 건배! – CupOfJoe

답변

0

MySQL은 '아무튼 다중 차원 레코드를 반환하지 않습니다. 모든 기록은 1-D입니다. 대부분의 관계형 DB는 그렇게합니다. 내가 믿고있어

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들 ... :

당신은 당신이 언어의 데이터를 필요로하는지에 따라, 비록 1 열에 여러 개의 값을 수집하는 GROUP_CONCAT를 사용할 수 있습니다 추가로 JOIN (다중)을 teacher_languages에 연결하고 다른 JOIN (단일)을 languages으로 설정 한 다음 GROUP_CONCAT을 사용하여 다중 언어 레코드를 1 값으로 수집해야합니다.

+0

내가 제안한 것을 시도했지만 현재 문제는 한 사용자의 정보와 함께 하나의 값을 반환하고 모두를 concat 사용 가능한 언어가 포함되어 있습니다. – CupOfJoe

+0

'GROUP BY u.id'가 누락되었습니다. 코드에서 작성한 것처럼 혼란 스럽습니다. 왜 그렇게 썼습니까? – CupOfJoe

+0

모르겠다 =) 방금 'GROUP BY u.id'라고 말할 수 있었 겠지만 ... 나는 대답을 바꾸었다. 죄송합니다, 아주 명확하지 않습니다. 지금 작동합니까? – Rudie

관련 문제