MySQL将UNION替换为LEFT JOIN IFNULL

MySQL将UNION替换为LEFT JOIN IFNULL,mysql,performance,join,union,Mysql,Performance,Join,Union,对于标题,我很抱歉,但是我找不到更好的描述来描述我们的问题 我们有一个用户表和一个令牌表,这两个表都需要合并到一个表中,但出于性能原因,没有一个UNION ALL 表格结构如下: Table USER: ID Username Password Table TOKEN: ID User_ID Token Token_Secret 我们现在需要的是两个表的并集 用户始终存在,在大多数情况下,用户具有1个或多个令牌1:N。结果表应包含 ID Username Password 所有用户是否拥有

对于标题,我很抱歉,但是我找不到更好的描述来描述我们的问题

我们有一个用户表和一个令牌表,这两个表都需要合并到一个表中,但出于性能原因,没有一个UNION ALL

表格结构如下:

Table USER:
ID Username Password

Table TOKEN:
ID User_ID Token Token_Secret
我们现在需要的是两个表的并集

用户始终存在,在大多数情况下,用户具有1个或多个令牌1:N。结果表应包含

ID Username Password
所有用户是否拥有令牌,如果用户拥有令牌,则所有令牌

因此,有了工会,结果将是

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)
到目前为止,我试着做一个正确的连接,比如

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
但在本例中,我将获取所有用户,这些用户要么没有令牌,因此我从用户表中获取用户名、密码,要么仅从令牌表中获取令牌。。但我需要的是两者!如果用户还有一个令牌,我需要用户名、密码和所有重命名为用户名、密码的令牌

没有工会有没有办法做到这一点?联合的问题在于MySQL的诱惑和庞大的用户数量,这将迫使MySQL编写一个至少包含10000条记录的临时表

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、用户、令牌:

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;

包含10000条记录的临时表不是很大。如果union都做了你想做的事情,那么就按照这个路线去做。union总共需要20多秒,所以在union中呆的时间肯定太长了。你确定问题出在union查询上吗?或者是一些联接使查询速度变慢了?它是否能更好地与UNION ALL一起工作,这样它就不会尝试删除重复项?UNION是错误的方法!你好,瑞克,谢谢你的帮助,但是这个查询并没有真正给出我需要的结果集。结果的结构是不可改变的。我需要一个id,用户名,密码字段结构。连接令牌并不能提供正确的结构。该表后来被另一个需要该表结构的工具使用。我认为没有真正的方法来阻止连接。您的编辑也会丢失原始密码(如果存在)