2015-03-19 159 views
-1

在此表中,los.configuration具有由3列組成的分區鍵(1. groupname 2. class 3.yearofjoining)。可能有2班BPL和APL。我想從數據庫中選擇這兩個類別。Cassandra選擇查詢

所以我必須使用查詢:當我想這個查詢它返回一個錯誤

分區鍵部分類不能由相關限制(只有

SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 
AND CLASS IN ('APL','BPL') AND YEAROFJOINING IN (2014,2015); 

分區鍵的最後一部分可以)。

任何想法是什麼問題是?

+0

'這不行'不是一個好問題。它怎麼不起作用?而你的問題很可能是因爲你沒有將鍵空間添加到你的列家族中。試着用'select * from keyspace.table where condition1 = something'來看看它是否有效。 – kha 2015-03-19 10:38:21

+0

你想在where子句中使用OR條件嗎? http://stackoverflow.com/questions/10139390/alternative-for-or-condition-after-where-clause-in-select-statement-cassandra – 2015-03-19 10:40:27

+0

SELECT * from TABLE where condition1 = something or condition1 = something – Getz 2015-03-19 10:40:36

回答

1

這裏的主要問題是您正試圖在composite partition key的兩個部分上使用IN關係。 IN只能操作上一個部分的分區或集羣密鑰。

爲了讓您的查詢工作,你的PRIMARY KEY將需要分區上GROUPNAMECLASS,而聚集在YEAROFJOINING

PRIMARY KEY ((groupname, class), yearofjoining)) 

當我查詢您的表與該主鍵,使用原始查詢:

[email protected]:stackoverflow> SELECT * FROM CONFIGURATION 
    WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') 
    AND YEAROFJOINING IN (2014,2015); 

groupname | class | yearofjoining | value 
-----------+-------+---------------+------- 
     332 | APL |   2014 | test1 
     332 | APL |   2015 | test3 
     332 | BPL |   2014 | test2 

(3 rows) 

更多的想法:

  1. 我不知道在同一個查詢中,可以在分區的最後一部分和集羣密鑰上使用IN關係。所以我今天學到了東西!

  2. 我覺得不得不警告你,在你的分區密鑰上使用IN的性能不好(Is the IN relation in Cassandra bad for queries?)。實際上,多行鍵查詢已被識別爲Cassandra反模式。

  3. 我對這個問題的看法越多,如果您在YEAROFJOINING(而不是IN)上進行切片查詢,我認爲您的表現越好。所以,如果你想搜索將在序裏,說2014年和更高,更好的查詢將這樣的工作:

    [email protected]:stackoverflow> SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING >= 2014;

這將是因爲聚集鍵快YEAROFJOINING,這將利用您的磁盤排序順序。