2015-06-07 51 views
0

我有一個特定的問題,無法通過底部顯示的一個非常簡單的多子查詢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看起來像是錯誤的工具。

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

回答

0

您正在尋找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

0

嘗試:

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

相關問題