簡體   English   中英

SQL:列出用戶及其電話號碼和電子郵件地址

[英]SQL: list users with their phone numbers and email addresses

我想在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

我嘗試了一下:

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也可以在聚合表達式中使用:

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

要么DISTINCT

SELECT DISTINCT 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

INNER加盟

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

或兩者

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM