2014-09-14 4 views
1

나는 모든 그룹 이름 및 관련 사용자와 화면을 표시하려고MySQL의 쿼리 - 다른 테이블의 여러 행이 한 테이블에서 하나의 행

Table: User 
USER ID 
USER NAME 

Table: Group 
GROUP ID 
GROUP NAME 

Table: User Group 
GROUP ID 
USER ID 

다음과 같은 데이터 모델 한 - 프론트 엔드는 PHP입니다

내가 가진 쿼리는 다음과 같습니다 -

`SELECT a.group_id, 
     a.group_name, 
     GROUP_CONCAT(g.user_id) AS user_ids, 
     GROUP_CONCAT(u.user_fname) AS user_names 
FROM group a, user_group g, user u 
WHERE a.group_id = g.group_id 
AND g.user_id = u.user_id 
GROUP BY a.group_id` 

내 질문 : 당신이 위의 쿼리에서 볼 수 있듯이 - I 사용자 ID를 나타냅니다 연결된 문자열의 두 목록을 가지고 있고 사용자 이름. 내가 거기에 3. 다음

을 통해 객체의 배열을 전달하는 두 배열을 통해 2. 실행을 배열로 루프를 모두 연결된 문자열을 폭발하고 그들로부터 사용자 개체를 구성 1로 가지고 이것은 PHP에서 두통이된다 이 일을 더 효율적으로/더 나은 방법으로? 어떤 제안, 포인터를 주시면 감사하겠습니다.

답변

1

목록을 하나만 원하십니까?

SELECT g.group_id, g.group_name, 
     GROUP_CONCAT(g.user_id, ':', u.user_fname) AS names_and_ids 
FROM group g join 
    user_group ug 
    on g.group_id = ug.group_id join 
    user u 
    on ug.user_id = u.user_id 
GROUP BY g.group_id, g.group_name; 

주의 다음과 같이 변경 :

  • 나는 그래서 당신은 그룹 당 하나 개의 행을 얻을 group by을 추가했다.
  • 별칭을 테이블 이름의 약어로 변경하여 쿼리를 읽기가 더 쉽습니다.
  • 사용자 ID와 사용자 이름을 모두 하나의 목록에 포함하도록 group_concat()을 수정했습니다.
  • where 절에 암시 적 조인 대신 명시 적으로 join 구문을 사용하도록 join을 변경했습니다.
+0

고마워요 - 네, 제가 group by 절을 가지고 있었는데 방금 그 내용을 입력하지 못했습니다. 제가 제안한대로하면 모든 연결된 사용자 ID와 PHP 이름을 분리해야합니다. MySQL 내에서 관련된 배열을 반환하는 방법이있을 것으로 기대했다. 아마도 나는 너무 많은 것을 바랄뿐입니다. 더 좋은 응답을 보지 않으면 나는 당신의 것을 받아 들일 것입니다. – ChicagoSky

+0

mysqli_fetch_assoc()이라는 것이 있습니다. 아마도 그것은 당신이 원하는 것입니다. –

관련 문제