2014-03-25 53 views
-1

是否可以始終遵守元素約束的期望數量,方法是用先前寫入的數據填充剩餘的SQL數據集,數據插入順序?使用MySQL?使用MySQL,通過使用先前寫入的數據填充剩餘的數據集,始終保留數據集中預期數量的元素

編輯 在網上商店,我總是想顯示n個元素。我每w秒更新一次顯示元素,並且我想無限循環。

例如,使用表mytable的:

+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
+----+ 

喜歡的東西

SELECT id FROM myTable WHERE id > 3 ORDER BY id ALWAYS_RETURN_THIS_NUMBER_OF_ELEMENTS 5 

實際上將返回(其中ALWAYS_RETURN_THIS_NUMBER_OF_ELEMENTS不存在)

+----+ 
| id | 
+----+ 
| 4 | 
| 5 | 
| 4 | 
| 5 | 
| 4 | 
+----+ 
+1

雖然我覺得這個問題非常不尋常,但我沒有看到任何值得投票的事情。 –

+0

我不明白爲什麼我的問題有投票權。 –

回答

1

這是一個非常奇怪的需求。這裏有一個方法:

select id 
from (SELECT id 
     FROM myTable 
     WHERE id > 3 
     ORDER BY id 
     LIMIT 5 
    ) t cross join 
    (select 1 as n union all select 2 union all select 3 union all select 4 union all select 5 
    ) n 
order by n.n, id 
limit 5; 

您可能需要在n延長號碼列表,以確保你有足夠的行的最後limit

+0

這個陳述的要求有兩個詞可以滿足:* biz *和* arre *。 – spencer7593

+0

如果您閱讀我關於用例的編輯,也許它會更容易回答:) –

+0

使用這樣的查詢來滿足用例確實很奇怪。用例聽起來更像是一個演示問題,而不是數據檢索問題;剔除檢索行以使其通過重複行返回恰好N行的查詢並不是滿足用例的正確方法。 – spencer7593

1

不,這不是什麼LIMIT呢。子句LIMIT作爲語句執行的最後一步,聚合之後,HAVING子句之後和排序之後應用。

我無法理解一個用例,它需要您描述的功能類型。


隨訪

是戈登·利諾夫提供的服務將返回指定的結果,只要有在myTable至少一行滿足謂詞查詢。否則,它將返回零行。


這裏的EXPLAIN輸出戈登的查詢:

id select_type table   type key  rows Extra 
-- ------------ ---------------- ----- ------- ---- ------------------------------- 
1 PRIMARY  <derived2>  ALL    5 Using temporary; Using filesort 
1 PRIMARY  <derived3>  ALL    5 Using join buffer 
3 DERIVED           No tables used 
4 UNION           No tables used 
5 UNION           No tables used 
6 UNION           No tables used 
7 UNION           No tables used 
    UNION RESULT <union3,4,5,6,7> ALL 
2 DERIVED  myTable   range PRIMARY 10 Using where; Using index 

下面是原始查詢的EXPLAIN輸出:

id select_type table    type key  rows Extra 
-- ----------- ----------------- ----- ------- ---- ------------------------------- 
1 SIMPLE  myTable   range PRIMARY 10 Using where; Using index 

這似乎只是它會是一個整批莫如果該結果集包含少於五個(且多於零)的行,則重新高效地以重新處理來自原始查詢的結果集。 (當行數從5增加到1000或150,000時,它會更加奇怪。)

從結果集中獲取行的多個副本的代碼非常簡單:獲取行,以及如果結果集在獲取五行(或N個)之前已達到,然後將行指針重置回第一行,因此下一次獲取將再次返回第一行。在使用mysqli PHP,例如,你可以使用:

$result->data_seek(0); 

或者,對於那些仍然使用過時的mysql_接口:

mysql_data_seek($result,0); 

但如果你只返回五行,很可能你甚至沒有循環遍歷結果,並且您已經將所有行填入數組中。只需循環回數組的開頭。

對於不支持可滾動遊標的MySQL接口,我們只保存整個結果集並多次處理。使用Perl DBI,使用fetchall_arrayref和JDBC(它將把整個結果集存儲在內存中,而無需對連接進行特殊設置),我們會將結果集存儲爲一個對象。底線,將這個要求(產生一個正好五行的結果集)壓回數據庫服務器,並拉回行的重複副本和/或在內存中存儲行的重複副本看起來像是錯誤的滿足用例的方式。 (如果有理由在內存中存儲行的重複副本,那麼可以在不將數據庫的行重複副本從數據庫中取回的情況下實現。)

您說您正在使用/實現「循環緩衝區「,但是您選擇不要繞回到包含少於五行的結果集的開頭,而是需要讓MySQL返回重複的行。非常非常奇怪。

+0

我只是編輯我的問題,我只是想尊重一些元素。我想在循環緩衝區中使用它。 –

+0

@ Pier-AlexandreBouchard,如果緩衝區的循環,不會有兩個元素一樣圓? –

+0

循環緩衝區?你的意思就像一個圓形的廢紙簍? – spencer7593