CQL SELECT无法处理复合列的“in”

时间:2013-08-15 08:21:17

标签: cassandra cql cql3

我正在与cassandra和CQL挣扎。我正在定义这个表模式,

CREATE TABLE useradvisits (
  userid text,
  adid int,
  type int,
  timestamp timestamp,
  PRIMARY KEY (userid, adid, type)
 );

我想这样查询,

SELECT * from useradvisits where userid = 'user-1' and adId in (100, 1001);

但它说, 错误请求:PRIMARY KEY部分adid不受IN关系限制

我正在使用最新的datstax企业版3.1。

cqlsh控制台说,

[cqlsh 3.1.2 | Cassandra 1.2.6.1 | CQL spec 3.0.0 | Thrift protocol 19.36.0]

因为我需要(adId + type)是唯一的,即(100:1), (100:2)都存在于用户。任何人都可以帮我解决方法吗?

2 个答案:

答案 0 :(得分:7)

您从adid和type创建了一个复合列键。您可以添加到行键以创建合成。只需使用PRIMARY KEY ((userid, adid), type)创建模型,您的查询就可以运行。在这种方法的下方:您将始终必须指定adid。

您也可以执行相反的操作,并将类型添加到行键。如果你事先知道“类型”的范围,这可能会更好。

答案 1 :(得分:0)

我使用复合分区键以这种方式更改表。

 CREATE TABLE useradevents ( 
    userid varchar,        
    type int, 
    adId int,     
    timestamp timestamp,            
    PRIMARY KEY((userid, type), adId));

现在它的查询效果就像一个魅力。有人认为你需要限制类型值,在我的情况下只需要3个不同的值。

SELECT * from useradevents where userid = 'user-1' and type = 1 and adId in (100, 1001);

谢谢@omnibear!