2014-02-06 5 views
0

데이터베이스 클라이언트에서 작업 중이며 PHP 및 HTML로 작성된 페이지 중 하나에서 클라이언트의 모든 정보를 표시해야하지만 실행시 다음 쿼리 ('families'테이블의 모든 행을 선택한다고 가정 함)는 총 0 행을 반환합니다. 그것은 당신의 스키마 또는 데이터를 보지 않고 테이블SQL 쿼리가 의도 한 값을 반환하지 않습니다.

SELECT 
families.id AS fam_id, 
families.last_name AS fam_surname, 
families.address_1 AS fam_address_1, 
families.address_2 AS fam_address_2, 
families.city_id AS fam_city, 
families.phone AS fam_phone, 
families.mobile AS fam_mobile, 
families.email AS fam_email, 
families.f_d_worker_1 AS fam_fdw_1, 
families.f_d_worker_2 AS fam_fdw_2, 
families.status_id AS fam_status_id, 
families.trans_date AS fam_trans_date, 
families.entry_date AS fam_entry_date, 
families.exit_date AS fam_exit_date, 
families.eligible_date AS fam_eligible_date, 
families.active_date AS fam_active_date, 
families.lga_loc_id AS fam_lga_id, 
families.facs_loc_id AS fam_facs_id, 
families.ind_status_id AS fam_indig_id, 
families.referral_id AS fam_ref_id, 
families.active_status AS fam_act_status, 
families.comm_org_id AS fam_com_org, 
city.id AS city_id, 
city.name AS city_name, 
city.state_id AS city_state, 
city.post_code AS post_code, 
states.id AS state_id, 
states.long_name AS state_name, 
states.abbrev AS state_abbrev, 
client_status.id AS client_stat_id, 
client_status.name AS client_stat_name, 
community_org.id AS com_org_id, 
community_org.name AS com_org_name, 
facs_location.id AS facs_id, 
facs_location.name AS facs_name, 
lga_location.id AS lga_id, 
lga_location.name as lga_name, 
indig_status.id AS indig_id, 
indig_status.name AS indig_name, 
referrals.id AS ref_id, 
referrals.name AS ref_name, 
f_d_workers.id AS fdw_id, 
f_d_workers.first_name AS fdw_first_name, 
f_d_workers.last_name AS fdw_last_name, 
client_status.id AS client_id, 
client_status.name AS client_name 
FROM 
`families`, 
`city`, 
`client_status`, 
`community_org`, 
`facs_location`, 
`f_d_workers`, 
`indig_status`, 
`lga_location`, 
`referrals`, 
`states` 
WHERE 
families.city_id = city.id AND 
families.f_d_worker_1 = f_d_workers.id AND 
families.f_d_worker_2 = f_d_workers.id AND 
families.status_id = client_status.id AND 
families.lga_loc_id = lga_location.id AND 
families.facs_loc_id = facs_location.id AND 
families.ind_status_id = indig_status.id AND 
families.referral_id = referrals.id AND 
families.comm_org_id = community_org.id 
+0

당신은 정말 이걸 'INNER JOIN'을 사용해야합니다 ... – hichris123

+0

@ hichris123 INNER JOIN 함수에 대한 경험이 없으며, 약간의 연구만으로도 제 상황에 적절하다고 생각하지 않습니다. 어떻게 사용하는지 자세히 설명해 주시겠습니까? –

답변

1

의 모든 행을 반환해야 할 때, 나는 방법을 작동하지 않는 하나 이상의 조회에서 조인 더이 생각하는 것을 추측하기 위하여려고하고있다 일하게. 예를 들어, 쿼리는 모든 계열 레코드가 city_id, f_d_worker_1, f_d_worker_2, status_id, lga_loc_id, facs_loc_id, ind_status_id, referral_id 및 comm_org_id에 대해 null이 아닌 값을 가짐을 의미합니다. 패밀리 레코드에 각 필드에 대한 값이있는 경우 하나 이상의 해당 테이블 (도시, f_d_workers, client_status, lga_locations, facs_locations, indig_status, referrals, community_org)에 일치하는 id 필드가없는 것으로 나타납니다.

복잡한 쿼리가 제대로 작동하지 않을 때 주로 사용하는 첫 번째 단계는 내부 조인을 외부 조인으로 변환 한 다음 누락 된 레코드를 찾는 것입니다.

다른 한편으로는 하나 이상의 조인 요소가 선택적 (즉, f_d_worker_2 id가 없을 수도 있음) 인 경우 쿼리 자체에 외부 조인을 사용해야합니다. 이게 도움이 되길 바란다.

SELECT 
families.id AS fam_id, 
families.last_name AS fam_surname, 
families.address_1 AS fam_address_1, 
families.address_2 AS fam_address_2, 
families.city_id AS fam_city, 
families.phone AS fam_phone, 
families.mobile AS fam_mobile, 
families.email AS fam_email, 
families.f_d_worker_1 AS fam_fdw_1, 
families.f_d_worker_2 AS fam_fdw_2, 
families.status_id AS fam_status_id, 
families.trans_date AS fam_trans_date, 
families.entry_date AS fam_entry_date, 
families.exit_date AS fam_exit_date, 
families.eligible_date AS fam_eligible_date, 
families.active_date AS fam_active_date, 
families.lga_loc_id AS fam_lga_id, 
families.facs_loc_id AS fam_facs_id, 
families.ind_status_id AS fam_indig_id, 
families.referral_id AS fam_ref_id, 
families.active_status AS fam_act_status, 
families.comm_org_id AS fam_com_org, 
city.id AS city_id, 
city.name AS city_name, 
city.state_id AS city_state, 
city.post_code AS post_code, 
states.id AS state_id, 
states.long_name AS state_name, 
states.abbrev AS state_abbrev, 
client_status.id AS client_stat_id, 
client_status.name AS client_stat_name, 
community_org.id AS com_org_id, 
community_org.name AS com_org_name, 
facs_location.id AS facs_id, 
facs_location.name AS facs_name, 
lga_location.id AS lga_id, 
lga_location.name as lga_name, 
indig_status.id AS indig_id, 
indig_status.name AS indig_name, 
referrals.id AS ref_id, 
referrals.name AS ref_name, 
workers1.id AS fdw1_id, 
workers1.first_name AS fdw1_first_name, 
workers1.last_name AS fdw1_last_name, 
workers2.id AS fdw2_id, 
workers2.first_name AS fdw2_first_name, 
workers2.last_name AS fdw2_last_name, 
client_status.id AS client_id, 
client_status.name AS client_name 
FROM 
`families` 
LEFT OUTER JOIN `city` ON families.city_id = city.id 
LEFT OUTER JOIN `client_status` ON families.status_id = client_status.id 
LEFT OUTER JOIN `community_org` ON families.comm_org_id = community_org.id 
LEFT OUTER JOIN `facs_location` ON families.facs_loc_id = facs_location.id 
LEFT OUTER JOIN `f_d_workers` AS workers1 ON families.f_d_worker_1 = workers1.id 
LEFT OUTER JOIN `f_d_workers` AS workers2 ON families.f_d_worker_2 = workers2.id 
LEFT OUTER JOIN `indig_status` ON families.ind_status_id = indig_status.id 
LEFT OUTER JOIN `lga_location` ON families.lga_loc_id = lga_location.id 
LEFT OUTER JOIN `referrals` ON families.referral_id = referrals.id 
LEFT OUTER JOIN `states` ON city.state_id = states.id 

업데이트] 나는 이것이 당신이 얻을하려고했던 것입니다 생각합니다.

+0

다음은 스키마와 쿼리의 SQL 피들입니다. 나는 그것이 도움이되기를 바랍니다. 나는 SQL에 대한 약간의 경험이 있지만이 큰 쿼리는 조금 머리를 쓰는 것처럼 보입니다. http://sqlfiddle.com/#!2/b48d1 –

+0

도시, f_d_worker_1, f_d_worker_2 등의 패밀리 레코드에 0을 채우고있는 것으로 보입니다. 도시에는 f_d_workers 등의 해당 항목이없고 id = 그 이유는 쿼리가 아무것도 반환하지 않는 이유입니다. 이러한 값을 선택적으로 설정해야한다면 내부 조인이 아닌 외부 조인을 조인하게하십시오. 옵션이 아니면 가족 기록에 유효한 데이터 (예 : 찾아보기 테이블에있는 id 값)를 채 웁니다. – MichaelMilom

+0

이것은 한 단계에서 내 마음을 교차 시켰지 만 내외부 조인의 차이에 대한 경험이 없으므로 간단한 생각이었습니다. 나는 약간의 연구를하고 잘하면 올바른 쿼리를 내놓을 것입니다 :) –

관련 문제