0

我在 cassandra 中创建了表用户

 create table users (pcId int , userId int, friendId int,  age int, score int , name text, PRIMARY KEY (pcId, userId, friendId, score))

我插入数据:

 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 1, 2, 1, 12, 'l');
 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 1, 2, 2, 12, 'a');
 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 1, 2, 0, 15, 'p');
 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 2, 6, 1, 15, 'p');
 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 2, 7, 2, 15, 'p');

pcid | 用户名 | 朋友 | 分数 | 年龄 | 姓名

1 |      1 |        0 |     2 |  15 |    p
1 |      1 |        1 |     2 |  12 |    l
1 |      1 |        2 |     2 |  12 |    a
1 |      2 |        1 |     6 |  15 |    p
1 |      2 |        2 |     7 |  15 |    p

我的问题是:如何为每个用户 ID 选择 2 个按名称排序的朋友(朋友 ID、年龄、姓名、分数)?

我的结果应该是:

pcid | 用户名 | 朋友 | 分数 | 年龄 | 姓名

1 |      1 |        2 |     2 |  12 |    a
1 |      1 |        1 |     2 |  12 |    l
1 |      2 |        1 |     6 |  15 |    p
1 |      2 |        2 |     7 |  15 |    p
4

2 回答 2

1

如果您使用的是 Cassandra 3.6+,您可以PER PARTITION LIMIT 2在查询中使用:

SELECT * FROM users PER PARTITION LIMIT 2;

它将按照分区内的集群键指定的顺序为您提供每个分区的前两行。如果分区键对您很重要,您可能需要按分区键进行排序。

这意味着您当然需要更改分区键userid

这是对页面的引用SELECT

于 2016-12-01T18:46:57.967 回答
0

可以使用
cassandra 3.0 中引入的Materialized View

在 Cassandra 3.0 及更高版本中,物化视图是从另一个表的数据构建的表,具有新的主键和新属性。在 Cassandra 中,查询通过主键定义进行优化。标准做法是为查询创建表,并在需要不同查询时创建新表。在 Cassandra 3.0 之前,这些附加表必须在客户端应用程序中手动更新。物化视图自动接收来自其源表的更新。

创建一个像这样的物化视图。

CREATE MATERIALIZED VIEW users_friend AS
    SELECT *
    FROM test.users
    WHERE name IS NOT NULL AND 
    pcid IS NOT NULL AND 
    userid IS NOT NULL AND
    friendid IS NOT NULL AND 
    score IS NOT NULL
    PRIMARY KEY (pcid, userid, name, friendid, score)
    WITH CLUSTERING ORDER BY (userid ASC, name ASC, friendid ASC, score ASC)

现在,如果您在 users 表上插入数据,cassandra 会将数据复制到 users_friend
现在,如果您想要按姓名排序的朋友列表,请使用以下查询:

SELECT * FROM users_friend WHERE pcid = 1 and userid = 1

您将获得以下输出:

 pcid | userid | name | friendid | score | age
------+--------+------+----------+-------+-----
    1 |      1 |    a |        2 |     2 |  12
    1 |      1 |    l |        1 |     2 |  12
    1 |      1 |    p |        0 |     2 |  15

如果更新 userid = 1,friendid = 2 name

UPDATE users SET name = 'm' WHERE pcid = 1 AND userid = 1 and friendid = 2 and score = 2

你会得到

 pcid | userid | name | friendid | score | age
------+--------+------+----------+-------+-----
    1 |      1 |    l |        1 |     2 |  12
    1 |      1 |    m |        2 |     2 |  12
    1 |      1 |    p |        0 |     2 |  15

来源:https
://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateMV.html 更多:https ://cassandra-zone.com/materialized-views/

于 2016-12-02T18:44:57.903 回答