2013-02-20 3 views
0

나는 그 구조가 아래 그림에 나와있는 테이블이 있습니다MySQL의 테이블을 정규화

enter image description here

내 필요 쿼리를 작성하는 경우에만 N 행, n은 전체가이 같은 것을을 위의 표에있는 고유 한 이름의 수. 그리고 각 이름에 대한 여러 열의 모든 항목은 해당 행 자체에 포함되어야합니다. 나는 테이블에 존재하는 다양한 열에 대한 확실하지 않다 때문에, 그것을 사용하지 수, 내가 먼저 UNION 연산자를 사용하여 고려

enter image description here

:하지만, 최종 출력은 다음과 같아야합니다. 즉, 런타임에 새 열을 삽입 할 수 있기 때문에 테이블의 열을 알 수 없습니다. 그러나, 나는 컬럼의 수가 7이 될 것이라는 추가적인 장점을 가지고 있으며, 이는 항상 동일 할 것입니다. 내가 모르는 유일한 것은 그들의 이름이다.

그리고이 표를 종이에 인쇄 할 때 "NULL"을 모두 제거하고 공백으로 대체하는 것이 어떻게 가능합니까?

답변

0

UNION이 필요하지 않으면 GROUP BY이 필요합니다.

어떤 학생도 일부 마크에 대해 여러 개의 NULL이 아닌 값을 가질 수 있다고 가정합니다.

즉석에서 테이블 구조를 변경하는 것은 좋지 않습니다. 추가 표에 상점 표시 이름을 더 잘 표시합니다.

SELECT name 
    , IF(MAX(mark1) IS NOT NULL, MAX(mark1), '') AS mark1 
    , IF(MAX(mark2) IS NOT NULL, MAX(mark2), '') AS mark2 
    , IF(MAX(mark3) IS NOT NULL, MAX(mark3), '') AS mark3 
    , IF(MAX(mark4) IS NOT NULL, MAX(mark4), '') AS mark4 
    , IF(MAX(mark5) IS NOT NULL, MAX(mark5), '') AS mark5 
    , IF(MAX(mark6) IS NOT NULL, MAX(mark6), '') AS mark6 
    FROM name_marks 
    GROUP BY name 
; 

See it on SQLFiddle

을하지만, 다시 학생이이만큼 많은 상표 이름을 저장, 또한 나쁜 생각 : 조회 같이 보일 것이다이 방법은 다음과 같습니다. 테이블 studentsidname 열로 작성하고 id으로 참조하는 것이 좋습니다. 또한 모든 가능한 표시에 대해 열을 사용하여 레코드를 저장하는 것은 좋지 않은 아이디어입니다. idcourse 열을 가진 courses 테이블과 student_id, course_idmark 열을 가진 테이블 marks을 만드는 것이 더 좋습니다. 이것은 데이터 크기 및 유연성 (원하는만큼 많은 과정을 자유롭게 정의 할 수 있음)에서 최적입니다.

+0

이것은 실제로 원했던 것이지만, 테이블의 열 이름이 확실하지 않으므로이 경우에는 작동하지 않습니다. 나는 자바 프로그램과 함께 일하고있다. 그래서 Java 프로그램 내에서 새로운 테이블을 저장해야합니다. –

+0

information_schema 테이블 (http://dev.mysql.com/doc/refman/5.6/en/columns-table.html)에서 실제 열 이름을 가져올 수 있습니다. 또한 http://stackoverflow.com/questions/7111980/mysql-referring-to-columns-by-numbers를 살펴보십시오. – Olexa

관련 문제