2016-07-08 1 views
1

하나의 키 테이블, 동일한 열 이름을 가진 많은 데이터 테이블 및 하나의 사용자 테이블이 있습니다. 키 테이블에서 값을 선택하려고합니다. 이미이 키 테이블에서 선택된 항목에 고유 ID (uaID)로 각 데이터 테이블의 일부 선택된 값을 결합합니다 (각 키 테이블 결과에는 데이터 테이블의 범위 중 하나만, 전부는 아니고 일부 항목은 데이터 테이블에서 Null 결과를 반환하며 null 결과로 인해 아무 것도 없거나 생략되지 않도록하려는 경우) users 테이블의 각 결과에 대한 사용자 데이터 이것은 항상 결과를 가져올 것입니다.동일한 열 이름을 사용하여 다른 테이블의 여러 필드 선택/결합

내가 볼 수 있도록 내 테이블의 기본 버전을 "그려 보겠습니다".

keyTable 
----------------------------------------- 
| uaID | userID | key | appName | 
|---------------------------------------| 
| 1  | 7  | ABC01 | Physics | 
| 2  | 9  | DEF20 | Geometry | 
| 3  | 12 | XJG14 | Biology | 
| 4  | 19 | DAF09 | Chemistry | 
| 5  | 27 | KYT78 | Algebra | 
| 6  | 29 | PLF43 | Statistics| 
| 7  | 34 | COG89 | Geology | 
| 8  | 45 | HYL72 | Art  | 
| 9  | 48 | TSK45 | History | 
| 10 | 53 | BBS94 | GeoChem | 
| 11 | 59 | DOD10 | BioChem | 
| 12 | 27 | HKV62 | Music  | 
----------------------------------------- 

dataTable01 
----------------------------------------------- 
| uaID | sector | subSector | topic | 
|---------------------------------------------| 
| 2  | circle | volumn  | measure | 
| 7  | triangle | hypotenuse |pythagoras | 
| 8  | square |    |   | 
| 11 | triangle | hypotenuse |pythagoras | 
----------------------------------------------- 

dataTable02 
--------------------- 
| uaID | topic | 
|-------------------| 
| 1  | door | 
| 3  | window | 
| 9  | porch | 
| 12 |   | 
--------------------- 

dataTable03 
----------------------------------------------- 
| uaID | sector | subSector | topic | 
|---------------------------------------------| 
| 4  | cat | feline | kitty | 
| 5  | dog | canine | rover | 
| 6  | kangaroo | marsupial | jack | 
| 10 | bunny | leporidae | peter | 
----------------------------------------------- 

users 
------------------------------------------------------------------------ 
| userID | Title | firstName | lastName | email    | 
|----------------------------------------------------------------------| 
| 7  | Dr | Melissa | Smith  | [email protected]  | 
| 9  | Mr | Bob  | Andrews | [email protected]  | 
| 12 | Miss | Clare  | Greco  | [email protected]  | 
| 19 | Mr | Dan  | Fonseca | [email protected]  | 
| 27 | Mr | Matt  | Jones  | [email protected]  | 
| 29 | Mr | Chris  | Nimmo  | [email protected]  | 
| 34 | Mrs | Lisa  | Araujo | [email protected]  | 
| 45 | Miss | Raquel  | Bailey | [email protected] | 
| 48 | Dr | Steven  | Dowd  | [email protected] | 
| 53 | Prof | Roger  | Hesp  | [email protected]  | 
| 59 | Prof | Sally  | Bryce  | [email protected]  | 
| 65 | Mrs | Elena  | Eraway | [email protected]  | 
------------------------------------------------------------------------ 

그리고 이것은 내가 최종 결과로 달성하기 위해 노력하고 무엇을 : 나는 실행하여이를 달성하려고하고

------------------------------------------------------------------------------------------------------------------------------- 
| uaID | key | appName | sector | subSector | topic | title | firstName | lastName | email    | 
|-----------------------------------------------------------------------------------------------------------------------------| 
| 1  | ABC01 | Physics |   |    | door | Dr | Melissa | Smith | [email protected]  | 
| 2  | DEF20 | Geometry | circle | volumn  | measure | Mr | Bob  | Andrews | [email protected]  | 
| 3  | XJG14 | Biology |   |    | window | Miss | Clare  | Greco | [email protected]  | 
| 4  | DAF09 | Chemistry | cat | feline | kitty | Mr | Dan  | Fonseca | [email protected]  | 
| 5  | KYT78 | Algebra | dog | canine | rover | Mr | Matt  | Jones  | [email protected]  | 
| 6  | PLF43 | Statistics| kangaroo | marsupial | jack | Mr | Chris  | Nimmo  | [email protected]  | 
| 7  | COG89 | Geology | triangle | hypotenuse |pythagoras | Mrs | Lisa  | Araujo | [email protected]  | 
| 8  | HYL72 | Art  | square |    |   | Miss | Raquel  | Bailey | [email protected] | 
| 9  | TSK45 | History |   |    | porch | Dr | Steven  | Dowd  | [email protected] | 
| 10 | BBS94 | GeoChem | bunny | leporidae | peter | Prof | Roger  | Hesp  | [email protected]  | 
| 11 | DOD10 | BioChem | triangle | hypotenuse |pythagoras | Prof | Sally  | Bryce  | [email protected]  | 
| 12 | HKV62 | Music  |   |    |   | Mr | Matt  | Jones  | [email protected]  | 
------------------------------------------------------------------------------------------------------------------------------- 

:

$sql = "SELECT keyTable.uaID, keyTable.userID, keyTable.key, 
       keyTable.appName, dataTable01.sector, dataTable01.subSector, 
       dataTable01.topic, dataTable02.topic, dataTable03.sector, 
       dataTable03.subSector, dataTable03.topic, users.title, 
       users.firstName, users.lastName, users.email 
     FROM keyTable 
     LEFT OUTER JOIN dataTable01 ON keyTable.uaID = dataTable01.uaID 
     LEFT OUTER JOIN dataTable02 ON keyTable.uaID = dataTable02.uaID 
     LEFT OUTER JOIN dataTable03 ON keyTable.uaID = dataTable03.uaID 
     LEFT OUTER JOIN users ON keyTable.userID = users.userID"; 

을 나는 모든 keyTable 데이터를 얻을 수 . 나는 모든 사용자 데이터를 바로 얻을 수 있습니다. dataTable03 데이터도 모두 표시되지만 결과에 dataTable01 또는 dataTable02의 데이터가 표시되지 않습니다. dataTable03에 대한 호출을 생략하면 dataTable02의 모든 관련 데이터가 표시되지만 dataTable01의 데이터는 표시되지 않습니다. users 테이블에 대한 호출이 끝나고 항상 정상적으로 표시됩니다. 데이터 테이블에서 일치하는 필드 이름과 관련된 문제입니다. 언급 된 데이터가 누락 된 상태에서 오류가 전혀 발생하지 않고 프로세스가 완료됩니다. 나는 다른 JOINS - 내부 조인, 외부 조인, 외부 조인을 시도했습니다. 분명히이를 달성하는 방법이 있어야하지만이 특정 문제에 대한 웹 참조를 찾을 수 없습니다. 누군가 내가 잘못하고있는 것을 말해 줄 수 있습니까?

+0

입니다 원하는 결과가 입력 테이블의'topic' 컬럼에있을 때. 또한 왜'dataTable02'에'sector'와'subSector' 컬럼이 빠져 있는지 궁금합니다. 모든 데이터 테이블이 같은 컬럼을 가지고 있다고 말한 것 같아요. – Barmar

+0

내 예제 결과 테이블을 "그리는"때 실수를했기 때문에 Porch가 잘못된 위치에있었습니다. 필자는 테이블이 모두 동일한 구조/내용 일 필요는 없다는 것을 분명히 알기를 기대했습니다.이 테이블은 예제 테이블이라는 것을 기억하십시오. 이들이 모두 동일하다면 하나의 데이터 테이블을 사용하고 여러 테이블을 사용하는 대신 uaID를 통해이를 참조하는 것이 더 효율적입니다. – Cassandra

+0

추신 - 당신이 거기에 추가 한 바이올린을 사랑해.내일 진짜 상황에 대한 답을 적용하고 어떻게 진행되는지 알려 드리겠습니다.하지만 두 가지 방법 모두를 통해 피들 쇼가 진행될 것으로 기대합니다! 매우 감사. – Cassandra

답변

1

결합 후 COALESCE을 사용하여 일치하는 행이있는 테이블에서 널이 아닌 값을 확보 할 수 있습니다.

$sql = "SELECT k.uaID, k.userID, k.key, k.appName, 
       COALESCE(d1.sector, d3.sector, '') AS sector, 
       COALESCE(d1.subSector, d3.subSector, '') AS subSector, 
       COALESCE(d1.topic, d2.topic, d3.topic, '') AS topic, 
       users.title, users.firstName, users.lastName, users.email 
     FROM keyTable AS k 
     LEFT OUTER JOIN dataTable01 AS d1 ON k.uaID = d1.uaID 
     LEFT OUTER JOIN dataTable02 AS d2 ON k.uaID = d2.uaID 
     LEFT OUTER JOIN dataTable03 AS d3 ON k.uaID = d3.uaID 
     LEFT OUTER JOIN users ON k.userID = users.userID 
     ORDER BY k.uaID"; 

동일한 열 운영체제 TP 사용 UNIONdatatablesNN 테이블로부터의 데이터를 병합하는 다른 방법.

SELECT k.uaID, k.userID, k.key, k.appName, IFNULL(d.sector, '') AS sector, IFNULL(d.subSector, '') AS subSector, IFNULL(d.topic, '') AS topic, 
     u.title, u.firstName, u.lastName, u.email 
FROM keyTable AS k 
LEFT OUTER JOIN (
    SELECT uaID, sector, subSector, topic 
    FROM dataTable01 
    UNION 
    SELECT uaID, NULL, NULL, topic 
    FROM datatable02 
    UNION 
    SELECT uaID, sector, subSector, topic 
    FROM datatable03) AS d 
ON k.uaID = d.uaID 
LEFT JOIN users AS u ON u.userID = k.userID 
ORDER BY k.uaID 

DEMO

+0

바말 (Barmar)의 답변에 따르면'dataTable01.topic AS topic, dataTable02.topic AS topic, dataTable03.topic AS topic '(주제는 각 최상위 열에 대해 동일한 별칭이 됨)이지만 예제에서는 세 가지 항목 열 'topic_01, topic_02, topic_03' - 조금 혼란 스러웠습니다. 그런데 이전에 편집 해 주셔서 감사 드리며, ** 많은 것을 읽을 수있게되었습니다. 감사! – Cassandra

+0

모든 항목에 동일한 별칭을 사용할 수 없습니다. 요점은 당신이 그들 모두를 가져올 수 있도록 그들에게 다른 이름을 주어야한다는 것입니다. – Barmar

+0

Yip 그게 내가 생각한거야,하지만 난 여전히 그들 각각의 끝에 각각의 열이 필요합니다. – Cassandra

0

당신은 별칭

를 사용하는 것

시뮬 문제가 여기에 솔루션 : 왜`sector` 열에서`porch`이

php-mysql-how-to-resolve-ambiguous-column-names-in-join-operation

select * from common inner join (
(select link from table1) 
union 
(select link from table2) 
) as unionT 
on unionT.link = common.link 
+0

Ruben,이 작품은 위 결과 테이블로 결과를 전달하지는 않지만 고맙습니다. 대신 별칭 열이 더 많은 더 큰 결과 테이블을 만들고 원하는 값으로 나누어 여러 개의 새로 작성된 열에 각 값 (항목과 같은)에 대해 모두 한 열에 있어야합니다. – Cassandra

+0

결과에서 동일한 열에있는 데이터 테이블의 열을 가져와야하는 경우 유니온을 너무 살펴보고 그에 대한 외부 조인을합니다. 나는 그것을 시뮬 레이팅하려고 노력하고 있었고 (내 데이터를 위해 작동하며, 약간의 필요성도 조정해야 할 수도있다) : 원래의 대답에 추가했다. –

관련 문제