gpt4 book ai didi

MySQL 用 LEFT JOIN IFNULL 替换 UNION

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

对标题感到抱歉,但我找不到对我们的问题更好的描述。

我们有一个用户表和一个 token 表,两者都需要 UNIONt 到一个表中,但出于性能原因,没有 UNION ALL。

表结构如下:

Table USER:
ID Username Password

Table TOKEN:
ID User_ID Token Token_Secret

我们现在需要的是两个表的并集。

用户始终存在,大多数情况下用户拥有 1 个或多个 token (1:N)。结果表应包含

ID Username Password

所有用户(无论他们是否有 token ),如果用户有 token ,则所有 token

因此,使用 UNION 的结果将是

SELECT * FROM user WHERE (SOME JOINS TO GET THE RIGHT USERS)
UNION ALL
SELECT Token as Username, Token_Secret AS Password FROM token WHERE (SOME JOINS TO GET THE RIGHT TOKENS)

到目前为止我尝试过的只是做一个 RIGHT JOIN

SELECT IFNULL(b.Token, a.Username, b.Token) ... FROM 
(SELECT * FROM user WHERE (SOME JOINS)) AS a
RIGHT JOIN
(SELECT * FROM token WHERE (SOME JOINS)) AS b
ON
b.User_ID = a.ID

但在这种情况下,我将获取所有没有 token 的用户(因此我从用户表中获取用户名、密码)或仅从 token 表中获取 token 。但我需要的是两者!如果用户还有 token ,我需要用户名、密码和所有 token (重命名为用户名、密码)

有没有办法在没有 UNION 的情况下做到这一点? UNION的问题是MySQL中的临时表和巨大的用户量,这将迫使MySQL写入至少超过10.000条记录的临时表

最佳答案

SELECT u.id, u.user_name,
GROUP_CONCAT(t.token) AS tokens
FROM users u
LEFT JOIN tokens t ON t.user_id = u.id
GROUP BY u.id;

如果您需要 id、用户、 token :

SELECT u.id, u.user_name,
IFNULL(t.token, '(no token for this user)') as token
FROM users u
LEFT JOIN tokens t ON t.user_id = u.id
ORDER BY user_name, token;

关于MySQL 用 LEFT JOIN IFNULL 替换 UNION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32356481/

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