2012-09-24 22 views
0

我會嘗試儘可能多地解釋事情。 我有以下查詢來從不同的表中獲取記錄。使用多重連接提取長查詢記錄

SELECT 
    p.p_name, 
    p.id, 
    cat.cat_name, 
    p.property_type, 
    p.p_type, 
    p.address, 
    c.client_name, 
    p.price, 
    GROUP_CONCAT(pr.price) AS c_price, 
    pd.land_area, 
    pd.land_area_rp, 
    p.tagline, 
    p.map_location, 
    r.id, 
    p.status, 
    co.country_name, 
    p.`show`, 
    u.name, 
    p.created_date, 
    p.updated_dt, 
    o.type_id, 
    p.furnished, 
    p.expiry_date 
FROM 
    property p 
    LEFT OUTER JOIN region AS r 
    ON p.district_id = r.id 
    LEFT OUTER JOIN country AS co 
    ON p.country_id = co.country_id 
    LEFT OUTER JOIN property_category AS cat 
    ON p.cat_id = cat.id 
    LEFT OUTER JOIN property_area_details AS pd 
    ON p.id = pd.property_id 
    LEFT OUTER JOIN sc_clients AS c 
    ON p.client_id = c.client_id 
    LEFT OUTER JOIN admin AS u 
    ON p.adminid = u.id 
    LEFT OUTER JOIN sc_property_orientation_type AS o 
    ON p.orientation_type = o.type_id 
    LEFT OUTER JOIN property_amenities_details AS pad 
    ON p.id = pad.property_id 
    LEFT OUTER JOIN sc_commercial_property_price AS pr 
    ON p.id = pr.property_id 
WHERE p.id > 0 
    AND (
    p.created_date > DATE_SUB(NOW(), INTERVAL 1 YEAR) 
    OR p.updated_dt > DATE_SUB(NOW(), INTERVAL 1 YEAR) 
) 
    AND p.p_type = 'sale' 

一切工作正常,如果我從上面的查詢排除GROUP_CONCAT(pr.price) AS c_price,。但是當我包含它時,它只是給出了一個結果。我打算在上面使用羣組concat從表sc_commercial_property_price中獲取與此屬性ID匹配的逗號分隔價格p.id。如果屬性記錄存在於sc_commercial_property_price中,則以逗號分隔的形式與其他記錄一起獲取它們。如果不是,它應該返回空白。我在這裏做錯了什麼?

我會試着再解釋一下,如果我的問題不清楚。在此先感謝

回答

1

GROUP_CONCAT是一個聚合函數。當你包含它時,你告訴SQL有一個聚集。如果沒有GROUP BY,只有一行是回報,如:

select count(*) 
from table 

,你必須查詢是在MySQL,但不是在任何其他數據庫可以接受的語法。查詢不會自動按沒有函數的列進行分組。相反,它返回一個任意值。你能想象一個功能ANY,所以您查詢的是:

select any(p.p_name) as p_num, any(p.tagline) as tagline, . . . 

爲了解決這個問題,把當前所有變量group by子句:

GROUP BY 
    p.p_name, 
    p.id, 
    cat.cat_name, 
    p.property_type, 
    p.p_type, 
    p.address, 
    c.client_name, 
    p.price, 
    pd.land_area, 
    pd.land_area_rp, 
    p.tagline, 
    p.map_location, 
    r.id, 
    p.status, 
    co.country_name, 
    p.`show`, 
    u.name, 
    p.created_date, 
    p.updated_dt, 
    o.type_id, 
    p.furnished, 
    p.expiry_date 

誰寫的SQL大多數人都認爲這是件好事形式包含group by子句中的所有變量組,儘管MySQL並不一定要求這樣做。

+0

感謝隊友,加入'GROUP BY'子句做到了這一招 – WatsMyName

1

添加GROUP BY子句枚舉任何你打算有單獨的行。現在發生的是,它爲每個結果列選擇一些值,每pr.price選擇group_concat

+0

感謝'GROUP BY'訣竅 – WatsMyName