2017-03-03 46 views
1

該查詢的結果給了我0行,它應該給我3個最新的行(按Table1.Name分組)。 表1具有:「名稱」,「時間戳」,「電壓」。 表2具有:「名稱」,「數據」。爲什麼按小組排序並給出0響應

當我刪除「ORDER BY Table1.Timestamp」我得到3行(如預期),但他們是數據庫中我想要3最新的3個最舊的條目。 (我在表1和表2中有3個名稱值匹配)。

代碼:

SELECT * from Table1 
INNER JOIN Table2 
ON Table1.Name=Table2.Name 
GROUP BY Table1.Name 
ORDER BY Table1.Timestamp; 
+0

*「但它們是數據庫中我想要3個最新的3個最舊的條目。」* - 這個**不是** GROUP BY的一個工作。 'GROUP BY'不返回數據庫中的行。它使用數據庫中的值生成它返回的值。 – axiac

+0

搜索一個標有[tag:greatest-n-per-group]的類似問題。 – axiac

+0

如果您還在苦苦掙扎,請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a -very-simple-sql-query – Strawberry

回答

0

你可以嘗試進行這樣的查詢:

SELECT t.*,t2.* from Table1 t 
INNER JOIN Table2 t2 
ON t.Name=t2.Name 
WHERE t.Timestamp = (
    SELECT MAX(t3.Timestamp) FROM Table1 t3 
    WHERE t3.Name = t.Name 
) 
+0

@GuillaumeSTLR你的代碼工作!非常感謝。你碰巧知道爲什麼需要大約20秒來處理? – Esp

+0

這取決於您在數據庫中的行數。嘗試刪除GROUP BY語句! –

+0

我只有4000行。 – Esp

0

你可以排序最前的3:

SELECT * from Table1 
INNER JOIN Table2 
ON Table1.Name=Table2.Name 
ORDER BY Table1.Timestamp DESC 
LIMIT 3 
0

當你使用連接兩個或多個表,然後不要在選擇查詢中使用*。使用特定的列名避免選擇查詢中的列含糊不清,也可以使用Table1。 ,表2。但在選擇查詢中使用特定列的好方法。

SELECT Table1.Name,Table1.Timestamp從表1 INNER JOIN表2 ON Table1.Name = Table2.Name GROUP BY Table1.Name ORDER BY Table1.Timestamp;

相關問題