2017-10-18 106 views
-2

如何从连接中的选择字段使用自定义别名字段?如何使用连接中选择字段的自定义别名字段?

SELECT LOWER(CONCAT(`ufn`.`value`, '.', `uln`.`value`, CAST(RAND()*1e6 AS UNSIGNED))) AS `newlogin` 
FROM `user_firstname` AS `ufn` 
INNER JOIN `user_lastname` AS `uln` 
LEFT JOIN `user` AS `u` ON `u`.`login` = `newlogin` 
WHERE `ufn`.`sex` = 'male' AND `u`.`id` IS NULL 
ORDER BY RAND() 
LIMIT 1 

结果:sql-error.png

编辑:

我的解决方案,但...:

SELECT @newlogin 
FROM (
    SELECT @newlogin := LOWER(CONCAT(`ufn`.`value`, '.', `uln`.`value`, CAST(RAND()*1e6 AS UNSIGNED))) 
    FROM `user_firstname` AS `ufn` 
    INNER JOIN `user_lastname` AS `uln` 
    WHERE `ufn`.`sex` = 'male' 
    ORDER BY RAND() 
    LIMIT 1 
) AS `ufnX` 
LEFT JOIN `user` AS `u` ON `u`.`login` = @newlogin 
WHERE `u`.`id` IS NULL 
+0

范围问题。将第一次加入派生表中! – jarlh

回答

1

创建一个子查询新的登录和加入它:

SELECT LOWER(CONCAT(`ufn`.`value`, '.', `uln`.`value`, nl.num)) AS newlogin 
FROM (SELECT CAST(RAND()*1e6 AS UNSIGNED))) AS num 
    ) nl CROSS JOIN 
    `user_firstname` ufn CROSS JOIN 
    `user_lastname` uln LEFT JOIN 
    `user` u 
    ON `u`.`login` = LOWER(CONCAT(ufn.`value`, '.', uln.`value`, nl.num)) 
WHERE `ufn`.`sex` = 'male' AND `u`.`id` IS NULL 
ORDER BY RAND() 
LIMIT 1; 

否我用CROSS JOIN替换了INNER JOININNER JOIN没有ON是没有意义的。

编辑:

你似乎要测试多个值,从而获得匹配。你可以尝试在HAVING条款中进行比较。该条款可以参考SELECT中的列:

SELECT LOWER(CONCAT(ufn.`value`, '.', uln.`value`, CAST(RAND()*1e6 AS UNSIGNED))) AS newlogin 
FROM user_firstname` ufn CROSS JOIN 
    `user_lastname` uln 
WHERE `ufn`.`sex` = 'male' 
HAVING NOT EXISTS (SELECT 1 
        FROM user u 
        WHERE u.login = newlogin 
       ) 
ORDER BY RAND() 
LIMIT 1; 
+0

不可能!谢谢! :) –

+0

戈登刚刚阅读我的评论... – jarlh

相关问题