2013-05-20 264 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