2009-05-05 15 views

回答

2

要想從該表中的前5名得分手:

CREATE TABLE people 
      (id  int, 
       name string, 
       score int) 

試試這個SQL:

SELECT id, 
     name, 
     score 
FROM people p 
WHERE (SELECT COUNT(*) 
     FROM people p2 
     WHERE p2.score > p.score 
     ) <=4 

我認爲這應該工作在大多數地方。

2

否。語法不同。

你可以,但是,創建視圖:

/* Oracle */ 

CREATE VIEW v_table 
AS 
SELECT * 
FROM (
     SELECT * 
     FROM table 
     ORDER BY 
       column 
     ) 
WHERE rownum <= n 

/* MySQL */ 

CREATE VIEW v_table 
AS 
SELECT * 
FROM table 
ORDER BY 
     column 
LIMIT n 
+1

由於被迫定購視圖(至少在使用TOP n子句的SQL服務器上)的限制。 – Tomalak 2009-05-05 13:52:40

+1

和其他DBMS支持這個概念,但使用其他符號。 – 2009-05-05 13:59:30

+0

另外,某些DBMS不允許在視圖中使用ORDER BY子句。 – 2009-05-05 14:00:07

1

我不認爲這是可能的,即使只是MySQL和MSSQL之間。我做了一個模擬此類行爲的選項:

  1. 創建具有自動遞增int列的視圖;說「PagingHelperID」
  2. 喜歡寫查詢:SELECT columns FROM viewname WHERE PagingHelperID BETWEEN startindex AND stopindex

這將使訂貨困難,你將需要爲每個在你打算中檢索數據的順序不同的看法。

根據數據庫查詢時,您也可以隨時「重寫」您的sql,併爲重寫器定義自己的方法,但我認爲沒有任何「好」的方法來執行此操作。

1

如果桌子上有一個獨特的密鑰......

Select * From Table O 
Where (Select Count(*) From Table I 
     Where [UniqueKeyValue] < O.UniqueKeyValue) < N 

您可以用自己的標準,如果你想在「頂部」的定義是基於一些其他的邏輯不是唯一的關鍵...

編輯:如果定義「頂部」的含義的「排序」是基於一個非唯一的列或一組列,那麼你仍然可以使用這個,但你不能保證你將能夠得到正好N個記錄...

Select * From Table O 
    Where (Select Count(*) From Table I 
     Where nonUniqueCol < O.nonUniqueCol) < 10 

如果記錄8,9,10,11和12在[nonUniqueCol]中都具有相同的值,那麼查詢將只生成7條記錄('<')...或12(如果使用「< =」)

注:由於這涉及到相關子查詢時,性能可以是非常大的表的問題...

0

在看完這個以後,最大的問題是MySQL不符合ISO SQL:2003標準。如果是,你有這些方便的窗函數:

SELECT * from 
( SELECT 
    RANK() OVER (ORDER BY <blah>) AS ranking, 
    <rest of columns here>, 
    FROM <table> 
) 
WHERE ranking <= <N> 

唉,MySQL的(和其他人模仿它的行爲,如SQLite的),不這樣做,因此,整個限制問題。

退房維基百科這個片段(http://en.wikipedia.org/wiki/Window_function_(SQL)#Limiting_result_rows

相關問題