2013-02-12 78 views
8

我試圖創建一個查詢Slick 1.0.0返回一個行數等同於以下SQL語句:計數行用油滑1.0.0

SELECT COUNT(*) FROM table; 

我至今是:

val query = for { 
    row <- Table 
} yield row 
println(query.length) 

這打印[email protected]。此外,query.length似乎是scala.slick.lifted.Column類型。我找不到執行查詢的方法。我可以在文檔和其他任何地方找到的所有示例不能在Column上運行,或者在ScalaQuery上運行,並且不再工作。

我該怎麼做才能執行此操作?

回答

2

用途:

val query = for(row <- Table) yield row 
println(Query(query.count).first) 

count等同於 「SELECT COUNT(*)FROM表」。 爲了得到第一行也是唯一的行,你必須使用first來計數。

+2

只是一個簡短的提示:'count'已被棄用,以''長度爲青睞。 – notan3xit 2013-02-12 16:32:44

+0

好的,它適合你嗎? – thikonom 2013-02-12 16:37:22

+2

對於像'length'這樣的方法返回的'scala.slick.lifted.Column'類型的值有什麼想法嗎?你的解決方案確實有效,但是用三個'SELECT'生成一個冗長的語句。這對於一個簡單的計數來說似乎非常重要,沒有任何進一步的要求:'select x2.x3 from(select count(1)as x3 from(選擇x4.'id',x4.'value'from'table'x4)x5) x2' – notan3xit 2013-02-12 16:40:10

4

任何這些應該做的伎倆:

Query(MyTable).list.length 

(for{mt <- MyTable} yield mt).list.length 

(for{mt <- MyTable} yield mt.count).first 

更新:

小學nting的H2數據庫日誌顯示了這個最後的查詢,看起來最佳:

03:31:26.560 [main] DEBUG h2database - jdbc[2] 
/**/PreparedStatement prep10 = conn1.prepareStatement("select select count(1) from \"MYTABLE\" s5", 1003, 1007); 
+5

那麼,這將在計數之前創建一個包含完整結果集的列表。當然,它確實有效,但對於非常大的表而言,這是不切實際的,因爲長度將以時間和空間的O(n)複雜度計算。 – notan3xit 2013-02-12 18:52:33

+0

我已經添加了一個,但是可能會生成與thikonom的答案中相同的選擇語句。雖然它略有不同 – Jack 2013-02-12 19:01:17

+0

對於你的第三個版本,我得到一個'MySQLSyntaxErrorException'。 – notan3xit 2013-02-12 19:10:59

4

雖然我沒能檢查所生成的SQL中,你可以通過丟棄.LIST變短來源:

Query(MyTable.length).first 
+0

這看起來像對我來說最乾淨的解決方案,但它似乎仍然生成SQL來統計'MyTable'中的所有字段,並且效率不如'SELECT COUNT(*)FROM「MyTable」;' – dbau 2013-10-25 11:25:13

+0

問題頁面:https ://github.com/slick/slick/issues/175在那裏留言。 – Tvaroh 2013-11-14 14:55:39