gpt4 book ai didi

SQL:列出用户及其电话号码和电子邮件地址

转载 作者:行者123 更新时间:2023-11-29 13:29:08 25 4
gpt4 key购买 nike

我想在 PostgreSQL 中进行查询,列出我的用户及其电子邮件地址和电话号码(以逗号分隔),如下所示:

| user1 | email1@mail.com, email2@mail.com | +3612123123, +3623234234 |

表格是:

user - stores the user's data

user_email - stores the user's email addresses

user_phone - stores the user's phone numbers

我尝试了 obvius:

SELECT user.id, user.name
(
SELECT array_agg(user_email.email)
FROM user_email
WHERE user_email.user_id = user.id
) AS EmailAddresses,
(
SELECT array_agg(user_phone.phone)
FROM user_phone
WHERE user_phone.user_id = user.id
) AS PhoneNumbers
FROM user
ORDER BY user.id

但这会导致荒谬的查询时间(34 秒)。比我试过的:

SELECT user.id, user.name, array_agg(user_email.email), array_agg(user_phone.phone)
FROM user
LEFT JOIN user_email ON user_email.user_id = user.id
LEFT JOIN user_phone ON user_phone.user_id = user.id
GROUP BY user.id
ORDER BY user.id

这会产生非常好的查询时间(大约 100 毫秒)。但通过这种方式,它列出了电话号码和电子邮件地址的所有组合。因此,如果我有 3 个电子邮件地址和 3 个电话号码,那么它会列出 9 个电子邮件地址(每个地址的三倍)和 9 个电话号码。

有没有一种有效的方法来做我想做的事?

最佳答案

DISTINCT 可以在 aggregate expressions 中使用也是:

SELECT "user".id, name, array_agg(DISTINCT email) emails, array_agg(DISTINCT phone) phones
FROM "user"
LEFT JOIN user_email ON user_email.user_id = "user".id
LEFT JOIN user_phone ON user_phone.user_id = "user".id
GROUP BY "user".id
ORDER BY "user".id;

注意:如果您只需要逗号分隔的列表,您可能需要使用 string_agg()而不是 array_agg()

SQLFiddle

关于SQL:列出用户及其电话号码和电子邮件地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27859644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com