2010-01-19 45 views
0

我有兩個疑問:MySQL的:平均,並加入兩個查詢

SELECT 
    s.id AS id, 
    g.id AS group_id, 
    g.nazwa AS group_name, 
    s.nazwa AS station_name, 
    s.szerokosc AS szerokosc, 
    s.dlugosc AS dlugosc, 
    s.95 as p95, 
    s.98 as p98, 
    s.Diesel as diesel, 
    s.DieselTIR as dieseltir, 
    s.Super98 as s98, 
    s.SuperDiesel as sdiesel, 
    s.LPG as lpg, 
    s.ulica as ulica, 
    s.kodPocztowy as kod_pocztowy, 
    s.miasto as miasto, 
    w.id as wojewodztwo_id, 
    w.nazwa as wojewodzto_nazwa, 
    k.id as kraj_id, 
    k.kod as kraj_kod, 
    k.nazwa as kraj_nazwa, 
    s.data as date_mod, 
    s.active as active 
FROM stacje_main s 
JOIN stacje_grups g ON (s.grupa=g.id) 
JOIN wojewodztwa w ON (s.wojewodztwo=w.id) 
JOIN kraje k ON (w.kraj=k.id) 
WHERE s.data > 0; 

SELECT 
    AVG(rr.vote) as average, 
    COUNT(rr.station_id) counter 
FROM stacje_ratings rr 
GROUP BY rr.station_id; 

在第二個查詢並不是所有的ID(station_id)都存在,有時加倍。 用id加入station_id,併爲每個id給出rate的平均值。

,當沒有速率,在平均和計數器有問題的值必須是0。

當我合併這些查詢我看到只有該ID的問題,即具有存在station_id。 但我想看到所有。

回答

0

尊敬的兄弟,請根據您的需要使用左/右連接,您已經使用了內連接,因此它將搜索兩個表中存在的相同記錄。

SELECT * FRM TBL右連接上tbl1.id = tbl.id

TBL1如果假設你的右表,然後如果沒有匹配的記錄中不存在TBL1然後還所有這些記錄都填充

在左邊相同的情況下加入,但扭轉表名稱只...

:)

2

您需要使用LEFT JOIN(見MySQL JOIN syntax)。

這將返回NULL用於連接表中沒有匹配行的行,因此我使用COALESCE來替換它們0

SELECT 
    s.id AS id, 
    g.id AS group_id, 
    -- [...] 
    COALESCE(x.average, 0) AS average 
    COALESCE(x.counter, 0) AS counter 
FROM stacje_main s 
JOIN stacje_grups g ON (s.grupa=g.id) 
JOIN wojewodztwa w ON (s.wojewodztwo=w.id) 
JOIN kraje k ON (w.kraj=k.id) 
LEFT JOIN (
    SELECT 
    rr.station_id 
    AVG(rr.vote) as avarge, 
    COUNT(rr.station_id) counter 
    FROM stacje_ratings rr 
    GROUP BY rr.station_id 
) x ON (x.station_id = s.id) 
WHERE s.data > 0;