2016-12-01 2 views
0

У меня есть создать пользователя таблицы в КассандреКак выбрать элементы для каждого USERID из таблицы

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 | userid | дружелюбный | оценка | возраст | имя

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 

Мой вопрос: Как я могу выбрать для каждого USERID 2 друзей (friendid, возраст, имя, оценка), отсортированных по имени?

Мой результат должен быть:

pcid | userid | дружелюбный | оценка | возраст | имя

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

добавить имя первичного ключа после идентификатора пользователя, Кассандры по умолчанию Сортировки по кластерному ключевому столбцу –

+0

@AshrafulIslam Я не могу добавить имя в первичном ключе, потому что это обновляемое поле – kaio

ответ

1

Если вы используете Cassandra 3.6 + вы можете использовать PER PARTITION LIMIT 2 по Вашему запросу:

SELECT * FROM users PER PARTITION LIMIT 2; 

и это даст вам первые две строки каждого раздела в порядке, указанном ключа кластеризации внутри вашего раздела. Вам, вероятно, придется сортировать по вашему ключу раздела, если это важно для вас.

Это значит, что вам нужно изменить ключ раздела, чтобы быть вашим userid конечно.

Here's Ссылка на страницу SELECT.

+0

У меня должны быть пользователи pcid в том же узле, поэтому ключ раздела должен быть pcid not userid. @ xmas79 – kaio

+0

@kaio Я не понимаю ваших требований, и, наоборот, вам следует избегать этого поведения в целом ... BTW, оставив 'pcid' в качестве вашего единственного ключа раздела, вы сможете запросить оставшуюся кластеризацию ключ, точно в порядке, указанном в определении таблицы ** только **: 'userId',' friendId', 'score'. Невозможно получить то, что вы хотите от этой таблицы, не повторяя код приложения. Вы можете легко получить то, что хотите, добавив мое определение таблицы к себе, денормализуя свои данные. Вам нужно будет позаботиться о заполнении/обновлении обеих таблиц. – xmas79

0

Вы можете использовать материализованные View
Он введен в Кассандре 3,0

В 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) 

Теперь, если вы вставляете данные на таблице пользователей, 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 

Если обновить идентификатор пользователя = 1, friendid = 2 имя

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/

+0

ok с материализованным представлением мы можем заказать по имени, но проблема сохраняется, потому что сортировка должна быть для каждого пользователя имеет список друзей – kaio