gpt4 book ai didi

mysql - 同一张表上的多个 LEFT JOINS 是否有效?

转载 作者:行者123 更新时间:2023-11-29 06:12:52 28 4
gpt4 key购买 nike

我必须处理以下模式(简化):

CREATE TABLE user
(`id` int,
`name` varchar(255),
PRIMARY KEY (id));

CREATE TABLE user_extra
(`user_id` int,
`user_extra_name` varchar(64),
`value` varchar(255),
UNIQUE INDEX user_id_extra_name (user_id, user_extra_name));

INSERT INTO user
(`id`, `name`)
VALUES
(1, 'John Doe'),
(2, 'Don Joe');

INSERT INTO user_extra
(`user_id`, `user_extra_name`, `value`)
VALUES
(1, 'phone', '1234444'),
(1, 'email', 'doe@example.com'),
(2, 'email', 'joe@example.com'),
(1, 'nickname', 'johnny'),
(2, 'nickname', 'donny');

我想以最高效的方式获取以下数据:

id  name        phone   email               nickname
1 John Doe 1234444 doe@example.com johnny
2 Don Joe (null) joe@example.com donny

除了电话、电子邮件和昵称之外,会有很多用户和可能更多的额外条目。

到目前为止,我所做的是对 user_extra 进行多个左连接:

SELECT
u.id, u.name,
uephone.value AS phone,
ueemail.value AS email,
uenick.value AS nickname
FROM
user u
LEFT JOIN
user_extra uephone ON
uephone.user_id = u.id AND
uephone.user_extra_name = 'phone'
LEFT JOIN
user_extra ueemail ON
ueemail.user_id = u.id AND
ueemail.user_extra_name = 'email'
LEFT JOIN
user_extra uenick ON
uenick.user_id = u.id AND
uenick.user_extra_name = 'nickname'

有没有更好的方法来解决这个问题?随着用户数量的增长,或者如果有十几个这样的左连接,这是否会导致性能问题?

SQLFiddle

最佳答案

自从您发布了简化 表架构(没有索引)后,我真的不能说您的查询是否有任何性能问题。可能如果 user.id 是主键并且 user_extra.user_id 也被索引,那么您的查询就很好。

如果您将针对 (user_id,user_extra_name)user_extra 添加复杂索引,那可能会更好。

但是对于小表,这里只是为了简化阅读这个查询是另一种方法:

http://sqlfiddle.com/#!9/0ab56b/20

SELECT
u.id, u.name,
ue.phone,
ue.email,
ue.nickname
FROM
user u
LEFT JOIN (
SELECT
user_id,
MAX(IF(user_extra_name = 'phone',`value`,null)) AS phone,
MAX(IF(user_extra_name = 'email',`value`,null)) AS email,
MAX(IF(user_extra_name = 'nickname',`value`,null)) AS nickname
FROM user_extra
GROUP BY user_id
) ue
ON
ue.user_id = u.id

但实际上,如果您的表上有索引,我相信您的查询是好的。

关于mysql - 同一张表上的多个 LEFT JOINS 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37473921/

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