我有两张桌子:
SELECT * FROM clubs_place_rubrics;
id | place_id | placerubric_id
-------+----------+----------------
20777 | 3626 | 7
(1 row)
SELECT * FROM clubs_placerubric LIMIT 5;
id | rubric
----+------------------------
1 | Тренажёрные залы
2 | Фитнес-клубы
3 | Косметические услуги
4 | Услуги массажиста
5 | Ледовые дворцы / Катки
所以有一些俱乐部,根本没有或根本没有足够的规则。从上面的例子中,只有一个俱乐部(id = 3626)有第7个标题。
那么为什么这段代码会返回空列表,多个空?
SELECT
place.id, place.title,
array_agg(phone.code) phone_code,
array_agg(phone.phone) phone_number,
array_agg(phone.fax) fax,
array_agg(email.email) email,
array_agg(site.site) site,
array_agg(rubric.rubric) rubrics
FROM clubs_place place
LEFT OUTER JOIN clubs_placephone phone
ON place.id = phone.place_id
LEFT OUTER JOIN clubs_placeemail email
ON place.id = email.place_id
LEFT OUTER JOIN clubs_placesite site
ON place.id = site.place_id
LEFT OUTER JOIN clubs_place_rubrics rubrics
ON place.id = rubrics.place_id
LEFT OUTER JOIN clubs_placerubric rubric
ON rubric.id = rubrics.placerubric_id
WHERE project='Москва'
GROUP BY place.id
LIMIT 6;
-[ RECORD 4 ]+-----------------------------------------------------------------------
id | 3629
title | Переделкино, банно-оздоровительный комплекс
phone_code | {499,495}
phone_number | {7379358,7311313}
fax | {t,t}
email | {gup@gup-bok.ru,gup@gup-bok.ru}
site | {www.gup-bok.ru,www.gup-bok.ru}
rubrics | {NULL,NULL}
-[ RECORD 5 ]+-----------------------------------------------------------------------
id | 3630
title | Досуг и здоровье, физкультурно-оздоровительный комплекс
phone_code | {499}
phone_number | {1281877}
fax | {f}
email | {""}
site | {www.apollon.ru}
rubrics | {NULL}
-[ RECORD 6 ]+-----------------------------------------------------------------------
id | 3631
title | Центр Корона, спортивно-развлекательный центр
phone_code | {495,495,495}
phone_number | {7532650,7540511,7941880}
fax | {f,f,f}
email | {centr-corona@yandex.ru,centr-corona@yandex.ru,centr-corona@yandex.ru}
site | {"","",""}
rubrics | {NULL,NULL,NULL}
似乎与手机数相同的计数。但没有逻辑。我想,我在SQL语法中犯了一个错误。
肯定在rubrics的结果列表中不应该有多个null。对于网站,电子邮件和所有其他行,它们都没有任何价值。
如何解决这个问题?
感谢。
答案 0 :(得分:0)
如果这些表中有任何一个条目:
LEFT OUTER JOIN clubs_placephone phone
ON place.id = phone.place_id
LEFT OUTER JOIN clubs_placeemail email
ON place.id = email.place_id
LEFT OUTER JOIN clubs_placesite site
ON place.id = site.place_id
然后你会有多个地方记录和你的
LEFT OUTER JOIN clubs_place_rubrics rubrics
ON place.id = rubrics.place_id
多次加入时加入。聚合后,这些多行的NULL将显示在聚合中。
你能否确认place_id在以下任何一个中都不重复:clubs_placephone,clubs_placeemail和clubs_placesite?
如果存在重复项,那么您可能希望使用子查询来一对一地进行这些连接以避免重复。