2012-08-22 13 views
0

두 개의 테이블과 과목과 과목이 있습니다. 수학, 과학, 사회여러 테이블에서 하나의 레코드를 그룹화하는 방법

이 3 개 레코드를 반환 :
이름, 수학
을 각 장에서 많은 비율을 하나의 "이름"대상이 같은 결과 1 개 이상의 주제에 따라 분류 될 수있다 이름, 과학
이름, 사회는


가 어떻게 대신 세 가지로 하나 개의 레코드를 얻을 수 있습니다 나의 통해 반복과 결합 결과 내 검색 수를 망쳐 놨어요? 따라서 검색 횟수가 정확하며 이름이 같은지 확인하고 추가 제목을 수집하기 위해 추가 PHP 코드가 필요하지 않습니까?

내가 기본

SELECT * FROM lesson INNER JOIN subjects ON subject.id = lesson.subject 

시도했다 그러나이 3 개 항목

편집 결과
내 쿼리가 I가 이어질 것보다 더 복잡하다. 위의 두 테이블과 해당 관계 추적을 유지하는 중간 테이블이 있습니다
이 쿼리는 검색 용입니다. 여기에 내가 가진 것이있다.

SELECT name, subject   
FROM lesson As l 
INNER JOIN lesson_sub As ls 
    ON ls.lesson_id = l.id 
INNER JOIN subjects As s 
    ON s.id = ls.subject_id 
WHERE CONCAT(l.name, s.subject) LIKE '%KEYWORD%' AND s.id = SUBJECT_ID 
+0

당신이 같은 프레임 워크를 사용하는 방법에 대해 생각 해본 적이 [CakePHP의] (http://cakephp.org/) 또는 [CodeIgnighter] (http://codeignighter.com/)에서 이런 종류의 것을 구현하는 유틸리티 메소드를 제공 할 수 있습니까? – tadman

답변

2

당신은 당신의 가입 쿼리로 GROUP_CONCAT() 함수를 사용 할 수

GROUP_CONCAT (EXPR)

,174,

이 함수는 그룹에서 NULL이 아닌 연결 된 값이 인 문자열 결과를 반환합니다. NULL이 아닌 값이 없으면 NULL을 반환합니다. 다음 전체 구문은 다음

GROUP_CONCAT ([DISTINCT] EXPR [EXPR ...] BY [ORDER unsigned_integer {| COL_NAME | EXPR} [ASC | DESC], ... COL_NAME] [세퍼레이터 str_val])

의 MySQL> SELECT STUDENT_NAME, -> GROUP_CONCAT (test_score) -> 학생 FROM - STUDENT_NAME BY> 기;

또는 :

MySQL의> SELECT STUDENT_NAME, -> GROUP_CONCAT (DISTINCT test_score - test_score DESC의 SEPARATOR ''BY> ORDER) -> 학생 FROM 이 - STUDENT_NAME BY> GROUP; 그래서

: (중간 테이블)

SELECT lesson.name, GROUP_CONCAT(subjects.name SEPARATOR ', ') 
    FROM lesson JOIN subjects ON (subject.id = lesson.subject) 
    GROUP BY lesson.name; 

TEST

CREATE TABLE lesson (name varchar (20), subject integer); 
CREATE TABLE subjects (id integer, name varchar(20)); 

INSERT INTO subjects VALUES (1, 'Math'), (2, 'Physics'), (3, 'Chemistry'); 

INSERT INTO lesson VALUES ('Lesson A', 1); 
INSERT INTO lesson VALUES ('Lesson A', 2); 
INSERT INTO lesson VALUES ('Lesson A', 3); 
INSERT INTO lesson VALUES ('Lesson B', 2); 
INSERT INTO lesson VALUES ('Lesson B', 3); 
INSERT INTO lesson VALUES ('Lesson C', 1); 

SELECT lesson.name, GROUP_CONCAT(subjects.name SEPARATOR ', ') 
    FROM lesson JOIN subjects ON (subjects.id = lesson.subject) 
    GROUP BY lesson.name; 

+----------+--------------------------------------------+ 
| name  | GROUP_CONCAT(subjects.name SEPARATOR ', ') | 
+----------+--------------------------------------------+ 
| Lesson A | Math, Chemistry, Physics     | 
| Lesson B | Chemistry, Physics       | 
| Lesson C | Math          | 
+----------+--------------------------------------------+ 
3 rows in set (0.00 sec) 

더 복잡 TEST

CREATE TABLE lesson (id integer, name varchar (20)); 
CREATE TABLE subjects (id integer, name varchar(20)); 
CREATE TABLE lesson_sub (lesson_id integer, subject_id integer); 

INSERT INTO subjects VALUES (1, 'Math'), (2, 'Physics'), (3, 'Chemistry'); 
INSERT INTO lesson VALUES (1, 'Lesson A'), (2, 'Lesson B'), (3, 'Lesson C'); 

INSERT INTO lesson_sub VALUES (1,1), (1,2),(1,3),(2,2),(2,3),(3,1); 

SELECT lesson.name, GROUP_CONCAT(subjects.name SEPARATOR ', ') AS subjects 
    FROM lesson_sub JOIN lesson ON (lesson.id = lesson_sub.lesson_id) 
        JOIN subjects ON (subjects.id = lesson_sub.subject_id) 
    WHERE CONCAT(lesson.name, subjects.name) LIKE '%Chem%' 
    GROUP BY lesson.name; 

SELECT name, subjects FROM (
    SELECT lesson.name, GROUP_CONCAT(subjects.name SEPARATOR ', ') AS subjects 
    FROM lesson_sub JOIN lesson ON (lesson.id = lesson_sub.lesson_id) 
        JOIN subjects ON (subjects.id = lesson_sub.subject_id) 
    GROUP BY lesson.name) AS lesson_clear 
    WHERE CONCAT(name, subjects) LIKE '%Chem%'; 

+----------+--------------------------------------------+ 
| name  | GROUP_CONCAT(subjects.name SEPARATOR ', ') | 
+----------+--------------------------------------------+ 
| Lesson A | Chemistry         | 
| Lesson B | Chemistry         | 
+----------+--------------------------------------------+ 
2 rows in set (0.00 sec) 

+----------+--------------------------+ 
| name  | subjects     | 
+----------+--------------------------+ 
| Lesson A | Physics, Math, Chemistry | 
| Lesson B | Physics, Chemistry  | 
+----------+--------------------------+ 
2 rows in set (0.00 sec) 
+0

Im 가져 오기 GROUP_CONCAT를 사용할 때 그룹 기능 쿼리를 잘못 사용했습니다. –

+0

사용중인 쿼리를 게시하십시오. 테스트 케이스로 내 대답 업데이트하기. – LSerni

+0

위대한 작품! 단 차이점은 내가 선택할 수있는 많은 열을 가지고 내가 outter 선택 SELECT * 할 괜찮아요,하지만 만약 내가 CONCAT (*)처럼하면 작동하지 않습니다. 내부 선택에서 반환 된 모든 필드를 CONCAT하는 아이디어? –

0

그것은 리터 귀하와 같은 사람들은 1 인당 1 건의 기록을 기대하고 있습니다. 이는 name입니다. 당신이 이름으로 기록에 표시된 과목을해야하는 경우

 SELECT name, count(*) subject_count 
     FROM lesson 
    INNER JOIN subjects ON subject.id = lesson.subject 
    GROUP BY name 
    ORDER BY name 

는,이 시도 : 여기

이 것을 할 수있는 방법

 SELECT name, 
      count(*) subject_count, 
      group_concat(subject) subjects 
     FROM lesson 
    INNER JOIN subjects ON subject.id = lesson.subject 
    GROUP BY name 
    ORDER BY name 
+0

그룹이 어디에서 작동합니까? –

+0

물론'GROUP BY'는'WHERE'와 함께 작동합니다. –

관련 문제