web-dev-qa-db-fra.com

Cassandra error - Order By uniquement pris en charge lorsque la clé de partition est restreinte par EQ ou IN

Voici le tableau que je crée, ce tableau contient des informations sur les joueurs qui ont joué la dernière coupe du monde.

CREATE TABLE players ( 
      group text, equipt text, number int, position text, name text,
      day int, month int, year int, 
      club text, liga text, capitan text,
PRIMARY key (name, day, month, year));

Lorsque vous effectuez la requête suivante:

Obtenez 5 noms des joueurs les plus âgés qui étaient capitaine de l'équipe de sélection

Voici ma requête:

SELECT name FROM players WHERE captain='YES' ORDER BY year DESC LIMIT 5;

Et je reçois cette erreur:

Order By n'est pris en charge que lorsque la clé de partition est restreinte par EQ ou IN

Je pense que c'est un problème avec la table que je crée, mais je ne sais pas comment le résoudre.

Merci.

13
fiticida

Votre définition de table est incorrecte pour la requête que vous essayez d'exécuter.

Vous avez défini une table avec la clé de partition "nom", les colonnes de clustering "jour", "mois", "année" et diverses autres colonnes.

Dans Cassandra toutes les requêtes SELECT doivent spécifier une clé de partition avec EQ ou IN. Vous êtes autorisé à inclure une partie ou la totalité des colonnes de clustering, en utilisant les opérateurs d'égalité et d'inégalité auxquels vous êtes habitué dans SQL.

Les colonnes de clustering doivent être incluses dans l'ordre de leur définition. Une clause ORDER BY ne peut inclure que des colonnes de clustering qui ne sont pas déjà spécifiques par un égaliseur, là encore dans l'ordre où elles sont définies.

Par exemple, vous pouvez écrire la requête

select * from players where name = 'fiticida' and day < 5 order by month desc;

ou

select * from players where name = 'fiticida' and day = 10 and month > 2 order by month asc;

mais non

select * from players where name = 'fiticida' and year = 2017;

qui n'inclut pas "jour" ou "mois"

et pas

select * from players where name = 'fiticida' and day = 5 order by year desc;

qui n'inclut pas "mois".

Ici est la documentation officielle sur la requête SELECT.


Pour satisfaire votre requête, la table a besoin

  • Une clé de partition spécifiée par EQ ou IN: "capitaine" fonctionnera
  • Une clause ORDER BY utilisant la colonne de clustering la plus à gauche: placez "year" à gauche de "month" et "day" dans votre définition de clé primaire
10
pconley