2017-11-10 1 views
1

데이터 레코드가있는 .csv 파일이 있는데, 각 행에는 조직의 부서가 있습니다. MySQL 데이터베이스로 가져 와서 웹 응용 프로그램에 표시하고 싶습니다. 데이터 레코드의 샘플 개요는 다음과 같습니다SQL 테이블에서 데이터를 분리하는 방법

물론
| Company A | Department aaa | 
| Company A | Department bbb | 
| Company A | Department ccc | 
| Company B | Department ddd | 
| Company B | Department eee | 
| Company C | Department fff | 
| Company C | Department ggg | 
| Company C | Department hhh | 
| Company D | Department iii | 
| Company E | Department jjj | 
| Company E | Department kkk | 

내가 그것을 이런 식으로 보이게하는 관련 부서가 부착 한 번 각 회사 보여주고 싶은, 더 많거나 적은 :

| Company A | Department aaa | 
|   | Department bbb | 
|   | Department ccc | 
| Company B | Department ddd | 
|   | Department eee | 
| Company C | Department fff | 
|   | Department ggg | 
|   | Department hhh | 
| Company D | Department iii | 
| Company E | Department jjj | 
|   | Department kkk | 

내 질문은 이러한 데이터 레코드를 연결하는 가장 좋은 방법은 무엇입니까? 적절한 프로그래밍 언어 (PHP, Ruby, Perl 등)를 사용하거나 SQL 쿼리를 사용하여 데이터베이스에서 수행합니까? SQL이 선택되면 저장 프로 시저, 임시 테이블 또는 가져 오기 인터페이스를 사용하여 수행 할 것입니까? 그것이 SQL이라면 어떻게 될 것입니까? 고맙습니다!

+0

파일을 기존 데이터베이스/응용 프로그램으로 가져 오는 방법을 묻는 질문입니까, 아직 설계하지 않은 CSV 파일 주변의 솔루션 디자인을 논의하는 질문입니까? 후자의 경우 IMHO는 SO에 대한 질문이 아닙니다. – Nope

+0

MySQL은이 쿼리를 비교적 간단하게 만드는 CTE ('WITH RECURSIVE' 절)를 지원하지 않습니다. PostgreSQL과 SQLite3은 다음 솔루션을 가지고 있습니다 : http://sqlfiddle.com/#!15/69fff/3/0 – tonypdmtr

+0

@tonypdmtr, MySQL 8.0.1 이상은 재귀 CTE를 지원합니다. 그러나 8.0은 현재 릴리스 후보 자격 상태에 있습니다. –

답변

1

당신과 함께 관련 회사를 저장해야 조직의 이름으로 모든 순서를 선택할 수 있습니다 그 데이터베이스의 모든 행에 부서가 있습니다. 데이터베이스의 행에 대한 암시 적 "순서"와 같은 것이 없기 때문에 행을 "이전"행과 동일하게 취급 할 수있는 방법이 없습니다 ("이전"에 대한 의미는 없습니다).

쿼리 결과 집합 행에서 중복 된 회사 이름을 비워 두지 않아도됩니다. 중복되는 것처럼 보일지라도 모든 행에 표시되도록하십시오.

그런 다음 응용 프로그램에서 데이터를 표시 할 때 을 수행하십시오.에 표시 할 때 순서대로 처리 할 수 ​​있습니다. 그래서 당신은이 (의사) 같은 것을 할 거라고 :

query 'SELECT Company, Department FROM MyTable ORDER BY Company, Department' 

prev_company = '' 

while row = fetch 
do 
    if row.company == prev_company 
     display '' 
    else 
     display row.company 
     prev_company = row.company 

    display row.department 
done 
+1

왜 downvote? 이것은 실제로 대부분의 응용 프로그램이 내 경험에 따라이 작업을 수행하는 방법입니다. –

-1

나는 SQL에서 그것을 할 것이고, 데이터베이스가 당신을 위해 그것을 할 수있을 때 나는 서버 코드에서 농구를 뛰어 넘을 어떤 필요성도 보이지 않기 때문에 일반 GROUP BY 유형의 쿼리 인 것처럼 보인다. 원하는 경우 원시 쿼리를 실행하거나 ORM을 사용하십시오. 는 SQL과 같은 뭔가를해야 어느 쪽이든 :

SELECT organisation, department FROM table GROUP BY organisation;

모든 부서 이름이 고유하지 않는 한, 당신은 단지

0

빌의 솔루션은 확실히 작동하지만, 내 편견이 만드는 것입니다를 별도의 데이터베이스 개체 (및 확장하여, 별도의 테이블) 언제가 많은 관계로 하나가 당신이 묘사하는 것과 같습니다.

그래서 나는 company 테이블과 department 테이블을 만들고 외래 키 company_id 열을 기준으로 company 테이블의 department 참조 행이있을 것입니다.
TABLE: company 
id 
name 

TABLE: department 
id 
company_id 
name 

그런 다음 당신은 당신이 어떤 데이터 구조를 당신이 필요로 쿼리 결과를 사후 처리 할 수 ​​있습니다 ... COMPANY_ID에 의해, 모든 부서 레코드를 선택 회사 테이블에 대해 가입 및 주문 수 있습니다.

데이터를 단일 테이블로 묶는 것보다 조인을 선호하는 데는 여러 가지 이유가 있습니다. 더 유연하고 상호 연관된 모델의 트리 구조를 모방합니다. 하지만 가장 큰 이유는 다음과 같습니다.

데이터를 복제하지 않습니다. 회사 이름이 변경되면 해당 회사와 관련된 모든 레코드 대신 하나의 레코드 만 업데이트하면됩니다. 2) 더 유연합니다.나중에

관련 문제