2014-07-06 2 views
1

두 개의 테이블 module_configmodule_settings이 있습니다. 후자는 기본값이있는 행을 포함하고 전자는 기본값을 대체하는 행을 포함합니다.한 테이블의 여러 행이 다른 테이블의 한 행과 관련이있을 때 MySQL에 두 개의 테이블 조인

나는이 바이올린에 몇 가지 테스트 행이있는 테이블을 만들었습니다 : http://sqlfiddle.com/#!2/ad4eb. 내가 gid의 목록을 제공 할

1) : 여기

내 사양입니다. 예를 들어 100, 24, 48, 50을 입력합니다. 2) 각 gid에 대한 각 설정 ( module_settings에 주어진)에 대한 행을 반환하는 쿼리를 원합니다. module_settings.gid_specific0 인 모든 module_settings 행을 무시해야합니다. 3) value은 해당 행이있을 경우 module_config에 주어진 해당 값과 같고, 그렇지 않은 경우 값은 module_settings에 있습니다. 위의 바이올린으로

, 내가 (위의 4 개 gid 값의 입력) 다음 반환 할 수 있습니다 뭔가 싶습니다 gid_specific 동일입니다

| mid----- | gid | name-------- | value | 
| currency | 100 | hand_default | 12--- | 
| currency | 24- | hand_default | 17--- | 
| currency | 48- | hand_default | 29--- | 
| currency | 50- | hand_default | 0---- | 
| currency | 100 | bank_default | 0---- | 
| currency | 24- | bank_default | 0---- | 
| currency | 48- | bank_default | 0---- | 
| currency | 50- | bank_default | 0---- | 

그래서를 먼저 module_settings의 모든 행을 찾습니다 이 행은 midname의 고유 한 조합을 가짐으로써 구별됩니다. 그런 다음 각 gid에 대해 이러한 각 설정에 대한 행을 반환합니다. midcurrencynamehand_default 동일 동일 module_setting 행에 대해, 그것은 4 행, 100, 24, 4850의 각 gid 하나를 반환합니다 그래서. 남은 유일한 일은이 행과 연결할 값을 결정하는 것입니다. module_config에 행이 있고 module_settings.id과 같고 module_config.gid이 해당 행인 경우 module_config.value으로 표시된 값을 사용하고, 그렇지 않으면 module_settings.initial으로 지정된 기본값을 사용합니다.

알다시피, 나는 그것을 내 머리 속에 공식화했지만, 나는 이것을 쿼리 문에 넣는 것만으로는 머리를 쓸 수 없다. 누군가가 약간의 빛을 비출 수 있다면 나는 정말로 감사 할 것입니다.

+0

'gid' ='50 '은 어디에서 왔을까요? –

+0

PHP 코드에서'gid' 값의 배열이있을 것입니다 (이것은 db의 다른 테이블에서 가져온 것입니다). –

+0

피들을보고 피클 테이블에서 산출물을 얻을 수 있는지 확인하십시오. –

답변

0

Teradata SQL을 사용했습니다. 나는 당신이 시도한다면 확실한 SQL 구문을 찾을 수있을 것이다.

나는 두 테이블에 덧붙여서 tbl3을 PHP 배열에서 오는 gid의 소스로 사용했다.

단계 1 : 크로스이 결과 module_settingsmodule_config

SELECT mid,gid,name, b.value1 
FROM IBB_APP.module_settings a, IBB_APP.module_config b 
WHERE gid_specific = 1; 

조인 너무 GID = 50을주는 tbl3 포함

mid          gid name        value1 
-------------------------------- ----------- -------------------------------- ---------- 
currency         100 hand_default      12 
currency         24 hand_default      17 
currency         48 hand_default      29 
currency         100 bank_default      12 
currency         24 bank_default      17 
currency         48 bank_default      29 

2 단계이다.

SELECT mid,c.gid,name, 
    CASE WHEN b.gid = c.gid THEN b.value1 
     WHEN b.gid IS NULL THEN a.initial1 END AS value1 
FROM IBB_APP.module_settings a, IBB_APP.module_config b 
RIGHT OUTER JOIN IBB_APP.tbl3 c ON (b.gid = c.gid) 
WHERE gid_specific = 1 
ORDER BY name,c.gid; 

결과는 내가이 도움이와 내가 제대로 귀하의 요구 사항을 이해 바랍니다

mid          gid name        value1 
-------------------------------- ----------- -------------------------------- ---------- 
currency         24 bank_default      17 
currency         48 bank_default      29 
currency         50 bank_default      0 
currency         100 bank_default      12 
currency         24 hand_default      17 
currency         48 hand_default      29 
currency         50 hand_default      0 
currency         100 hand_default      12 

입니다.

+0

우연한 만의 만남 – Strawberry

관련 문제