在同一个简单的SELECT中导致多个查询无法进行子查询SELECT导致使用MySQL的单个多行结果

问题描述:

我有一个特定的问题,无法通过底部显示的一个非常简单的多子查询SELECT来解决:取查询1在同一个简单的SELECT中导致多个查询无法进行子查询SELECT导致使用MySQL的单个多行结果

SELECT playername AS Rookie FROM MinecraftMySQL.`lb-players` WHERE onlinetime >= 129600 AND onlinetime < 648000 ORDER BY playername; 

返回像

+------------------+ 
| Rookie   | 
+------------------+ 
| _Golden_Apple | 
| _MineTrick_  | 
+------------------+ 

(只是一个整结果的部分)和查询结果2

SELECT playername AS Eager FROM MinecraftMySQL.`lb-players` WHERE onlinetime >= 648000 AND onlinetime < 1296000 ORDER BY playername; 

返回类似(只是整个结果的一部分)

+-----------------+ 
| Eager   | 
+-----------------+ 
| 1Herofox  | 
| 1lyndon   | 
+-----------------+ 

的想法是那些列相结合,得到这样的:

+------------------+-----------------+ 
| Rookie   | Eager   | 
+------------------+-----------------+ 
| _Golden_Apple | 1Herofox  | 
| _MineTrick_  | 1lyndon   | 
+------------------+-----------------+ 

查询像

SELECT 
    (SELECT playername FROM MinecraftMySQL.`lb-players` WHERE onlinetime >= 129600 AND onlinetime < 648000) AS Rookie, 
    (SELECT playername FROM MinecraftMySQL.`lb-players` WHERE onlinetime >= 648000 AND onlinetime < 1296000) AS Eager 
; 

导致1242 (21000): Subquery returns more than 1 row。谷歌搜索是一个问题,因为我不知道要用什么单词;使用

mysql merge subqueries that return multiple rows 
mysql multiple columns in result from subqueries 
mysql select multiple queries as columns 

只是为了得到完全不同的东西。

结果主要是仅供人观看,行与其他列无关,所以只要性能没有下降太多,用什么方法合并那些列并不重要;因为它们根本不相关,所以使得JOIN看起来像是错误的工具。

这就是我理解停止的地方。

您正在寻找UNION

SELECT playername, 'Rookie' as Rank 
    FROM MinecraftMySQL.`lb-players` 
    WHERE onlinetime >= 129600 AND onlinetime < 648000 
UNION 
SELECT playername, 'Eager' as Rank 
    FROM MinecraftMySQL.`lb-players` 
    WHERE onlinetime >= 648000 AND onlinetime < 1296000 
ORDER BY playername; 
+0

它不会产生我在寻找的Cuz一个我要找的结果要简单得多读。 – rautamiekka

+0

不幸的是,阅读更简单并不意味着它是正确的解决方案。而子选择解决方案不够理想,难以阅读。如果有新手对Eager的数量不同,会发生什么?您应该格式化它以供用户阅读您的应用程序:) – Martin

+0

多个子查询(这两个不是唯一的)之间的行数有很大的差异,但是对于计算机来说,读取操作有多简单,只要性能取得的结果不会被杀死。 – rautamiekka

尝试:

SELECT Rookie.playername as Rookie, Eager.playername as Eager from 
    (SELECT distinct playername FROM MinecraftMySQL.`lb-players` WHERE onlinetime >= 129600 AND onlinetime < 648000) Rookie 
JOIN 
    (SELECT distinct playername FROM MinecraftMySQL.`lb-players` WHERE onlinetime >= 648000 AND onlinetime < 1296000) Eager 
; 
+0

这是非常接近的,但奇怪的是,第二列在显示另一个名称之前重复了很多行的单个名称:O – rautamiekka

+0

在第二个查询的playername前添加了不同的名称;更新超过 – rcheuk

+0

通过在两个子选项中增加DISTINCT来测试,它似乎有所作为,但不会影响上面提到的主要问题。 – rautamiekka