2013-05-20 215 views
0

我有一个SQL查询,几乎是正确的,但如果用户有从返回超过1架飞机,他们最终在结果多行列表数据库:SQL查询返回的结果太多

SELECT a.this_pay, 
    u.username, 
    u.user_id, 
    c.type_id, 
    c.is_primary, 
    x.typename, 
    p.pf_city, 
    p.pf_state, 
    n.username AS non_username, 
    n.user_id AS non_user_id, 
    n.pf_city AS non_pf_city, 
    n.pf_state AS non_pf_state 
    FROM (((((jowner_event_attendees a 
    LEFT JOIN jowner_users u ON a.user_id = u.user_id) 
    LEFT JOIN jowner_aircraft c ON a.user_id = c.user_id) 
    LEFT JOIN jowner_aircraft_types x ON x.id = c.type_id) 
    LEFT JOIN jowner_profile_fields_data p ON a.user_id = p.user_id) 
    LEFT JOIN jowner_not_users n ON a.user_id = n.user_id) 
    WHERE a.event_id = 28 ORDER BY COALESCE(u.username,non_username); 

我最终得到一个有多个条目的列表,对于有多架飞机的任何人,我只需要返回1个条目,无论他们在'jowner_aircraft'表中有多少条飞机条目。

我也不希望改变这个查询,因为应用程序的其他部分依赖它,显然它需要我所要求的修订,但请尝试在没有完全重写的情况下回答它。

+0

看到这样的子选择从来就不是好事。这不能被写成一个单一的'SELECT'调用连接? – tadman

+0

我正在从其他人的平庸的代码工作,问题是该应用程序是依赖于此,所以我犹豫是否要改变它太多...如果你能想出一个结构更好的查询,并为我工作,然后发布起来:D – DrCord

+2

如果有多个jowner_aircrafts,应该选择哪个aircraft typename和type_id? – femtoRgon

回答

2
SELECT a.this_pay, 
    u.username, 
    u.user_id, 
    c.type_id, 
    x.typename, 
    p.pf_city, 
    p.pf_state, 
    n.username AS non_username, 
    n.user_id AS non_user_id, 
    n.pf_city AS non_pf_city, 
    n.pf_state AS non_pf_state 
    FROM (((((jowner_event_attendees a 
    LEFT JOIN jowner_users u ON a.user_id = u.user_id) 
    LEFT JOIN jowner_aircraft c ON a.user_id = c.user_id AND c.is_primary=1) 
    LEFT JOIN jowner_aircraft_types x ON x.id = c.type_id) 
    LEFT JOIN jowner_profile_fields_data p ON a.user_id = p.user_id) 
    LEFT JOIN jowner_not_users n ON a.user_id = n.user_id) 
    WHERE a.event_id = 28 ORDER BY COALESCE(u.username,non_username); 
+0

谢谢!由于femtoRgon的帮助,我知道由于一个富有洞察力的问题而改进了我的问题,这有助于解决方案! – DrCord

+0

虽然,我怀疑c.is_primary == 1真的是你要找的。 –

+0

实际上是:D – DrCord

0

会一

SELECT 
a.this_pay, 
u.username, 
u.user_id, 
c.type_id, 
x.typename, 
p.pf_city, 
p.pf_state, 
n.username AS non_username, 
n.user_id AS non_user_id, 
n.pf_city AS non_pf_city, 
n.pf_state AS non_pf_state 
FROM (((((jowner_event_attendees a 
LEFT JOIN jowner_users u ON a.user_id = u.user_id) 
LEFT JOIN jowner_aircraft c ON a.user_id = c.user_id) 
LEFT JOIN jowner_aircraft_types x ON x.id = c.type_id) 
LEFT JOIN jowner_profile_fields_data p ON a.user_id = p.user_id) 
LEFT JOIN jowner_not_users n ON a.user_id = n.user_id) 
WHERE a.event_id = 28 ORDER BY COALESCE(u.username,non_username) 
LIMIT 1; 

是出了问题?

稍微澄清一下会有帮助,比如这个查询最终设计了什么。如果它最初设计为返回多行,并且您需要它来达到另一个目的,那么理由是您应该给它一个很好的全面检修。

+0

它不应该返回多行,因为它显示的是与会者列表,我在飞机线中添加了一些骇客:“左连接jowner_aircraft c on a.user_id = c.user_id) LEFT JOIN jowner_aircraft_types x ON x.id = c.type_id)“,他们似乎工作正常,但现在我发现他们不太... – DrCord

+0

我想我明白了。你将会加入到你的飞机桌上,所以很自然地,它会把发生在拥有多架飞机上的每一行“所有者信息”变成多行。如果你只需要一行他们的飞机信息“jowner_aircraft”和“jowner_aircraft_types”,那么你应该考虑使用子选择,因为它想要抓住所有这些信息。否则,你将需要做一些功能级联,或其他“不同”。 –

+0

OP用** MySQL **标记了他的问题。即使由于整个查询而需要获取单个记录(并且它似乎并非如此),您将需要“LIMIT 1”,因为“TOP 1”特定于SQL Server。 –

0

您应该只需要添加另一个where子句来消除除了is_primary为true之外的所有记录。

SELECT a.this_pay, 
u.username, 
u.user_id, 
c.type_id, 
c.is_primary, 
x.typename, 
p.pf_city, 
p.pf_state, 
n.username AS non_username, 
n.user_id AS non_user_id, 
n.pf_city AS non_pf_city, 
n.pf_state AS non_pf_state 
FROM jowner_event_attendees a 
LEFT JOIN jowner_users u ON a.user_id = u.user_id 
LEFT JOIN jowner_aircraft c ON a.user_id = c.user_id 
LEFT JOIN jowner_aircraft_types x ON x.id = c.type_id 
LEFT JOIN jowner_profile_fields_data p ON a.user_id = p.user_id 
LEFT JOIN jowner_not_users n ON a.user_id = n.user_id 
WHERE a.event_id = 28 
AND c.is_primary = 1 
ORDER BY COALESCE(u.username,non_username); 

替换“true”的正确值是is_primary。

+0

这实际上没有工作,并有副作用或诉诸返回的与会者名单。 – DrCord

+0

第一次没有注意到'order by'子句。 – femtoRgon