這裏的主要問題是您正試圖在composite partition key的兩個部分上使用IN
關係。 IN
只能操作上一個部分的分區或集羣密鑰。
爲了讓您的查詢工作,你的PRIMARY KEY將需要分區上GROUPNAME
和CLASS
,而聚集在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)
更多的想法:
我不知道在同一個查詢中,可以在分區的最後一部分和集羣密鑰上使用IN
關係。所以我今天學到了東西!
我覺得不得不警告你,在你的分區密鑰上使用IN
的性能不好(Is the IN relation in Cassandra bad for queries?)。實際上,多行鍵查詢已被識別爲Cassandra反模式。
我對這個問題的看法越多,如果您在YEAROFJOINING
(而不是IN
)上進行切片查詢,我認爲您的表現越好。所以,如果你想搜索將在序裏,說2014年和更高,更好的查詢將這樣的工作:
[email protected]:stackoverflow> SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING >= 2014;
這將是因爲聚集鍵快YEAROFJOINING
,這將利用您的磁盤排序順序。
'這不行'不是一個好問題。它怎麼不起作用?而你的問題很可能是因爲你沒有將鍵空間添加到你的列家族中。試着用'select * from keyspace.table where condition1 = something'來看看它是否有效。 – kha 2015-03-19 10:38:21
你想在where子句中使用OR條件嗎? http://stackoverflow.com/questions/10139390/alternative-for-or-condition-after-where-clause-in-select-statement-cassandra – 2015-03-19 10:40:27
SELECT * from TABLE where condition1 = something or condition1 = something – Getz 2015-03-19 10:40:36