我有两个问题:
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的平均速率值。
当没有费率时,平均值和计数器中的值必须为0的问题。
当我合并这些查询时,我只看到了这个ID,它出现了station_id。 但我希望看到所有。
答案 0 :(得分: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;
答案 1 :(得分:0)
亲爱的兄弟,请根据您的需要使用左/右连接,您已使用内连接,因此它将搜索两个表中的相同记录。
在tbl1.id = tbl.id上选择* frm tbl右连接tbl1
如果假设你的右表,那么如果tbl1中没有匹配的记录,则所有这些记录都被填充
左连接中的相同情况但仅反转表名...
:)