2012-11-08 18 views
8

sử dụng CF:truy vấn cql3 với hạn chế hơn 1 EQ và ORDER BY

CREATE TABLE history (
    domain text, 
    iid text, 
    timeid timeuuid, 
    data text, 
    comments text, 
    PRIMARY KEY (domain, iid, timeid) 
); 

Tôi muốn truy vấn nó như thế này:

select domain, iid, timeid, data, comments from mappings 
where domain = 'a' and iid = 'b' order by timeid desc; 

Nhưng nó không có lỗi (cassandra sau 1.1.5):

Bad Request: Order by currently only support the ordering of columns following their declared order in the PRIMARY KEY 

Tôi có làm sai không? Điều gì có thể là giải pháp thay thế? Thx

PS Tôi đã làm việc này với giới hạn EQ đơn và ORDER BY nhưng tôi cần ít nhất 2 hạn chế và đặt hàng trước.

+0

Có phải 'iid' là một cột được lập chỉ mục không? – lstern

+4

Tôi không muốn ngăn cản bạn nhưng theo: http://www.datastax.com/dev/blog/whats-new-in-cql-3-0 "ORDER BY mệnh đề chỉ có thể chọn một đơn cột, và cột đó phải là cột thứ hai trong tổng hợp PRIMARY KEY. Điều này giữ ngay cả đối với các bảng có nhiều hơn 2 cột thành phần trong khóa chính. "Hy vọng điều này sẽ sớm thay đổi. Đang thay đổi tùy chọn CF? – Oren

+0

@Istern miễn là iid là một phần của khóa chính tôi mong đợi nó được lập chỉ mục –

Trả lời

9

Bạn có thể thay đổi thứ tự bằng 'cột để cột thứ hai trong khóa chính:

select * from history where domain = 'a' and iid = 'b' order by iid desc;

Đó là một chút bối rối vì bạn giới hạn iid với bình đẳng, nhưng nó hoạt động - bạn sẽ nhận được kết quả của bạn được sắp xếp bởi timeid.

Tôi tin rằng điều này là do iidtimeid dạng một cột composite và khi bạn đặt hàng bằng cách iid thứ tự giảm dần, nó ra lệnh cho tất cả các thành phần cột composit bao gồm timeid.

+1

+1 cho câu trả lời này cho đúng, -1 để Cassandra không hỗ trợ tính năng đơn giản này một cách đơn giản. –

+0

Tôi tin rằng nó nên được "đặt hàng bởi iid, desc". dấu phẩy bị thiếu. –

+0

xem các ví dụ ở đây - [liên kết] (https://docs.datastax.com/en/cql/3.1/cql/cql_using/useColumnsSort.html) - không cần dấu phẩy –