2014-02-06 112 views
0

我正在为我的客户端和页面之一(用PHP和HTML编写)的数据库工作,我需要在其客户端上显示所有信息,但是当我运行下面的查询(假设选择'family'表中的所有行),它返回总共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都将具有非空值。如果家庭记录具有这些字段中的每个字段的值,则看起来在一个或多个对应表(城市,f_d_workers,client_status,lga_locations,facs_locations,indig_status,引用,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等家庭记录填入零。在城市,f_d_workers等没有对应的条目,id =这就是为什么查询没有返回任何东西。如果这些值应该是可选的,那么使连接外部连接而不是内部连接。如果它们不是可选的,则用有效数据填充家庭记录(即查找表中存在的id值)。 – MichaelMilom

+0

这确实在一个阶段让我想到了,但是我没有内外联接区别的经验,所以这只是一个简短的想法。我会做一点研究,并希望拿出正确的查询:) –