/ / La requête SQLite ne fonctionne pas comme prévu - Android, sqlite

La requête SQLite ne fonctionne pas comme prévu - Android, sqlite

J'ai un problème avec une requête SQLite et je ne peux pas le découvrir. Voici ma table:

CREATE TABLE Exercise
(
e_id int auto_increment primary key,
name varchar(20)
);

CREATE TABLE PersonalList
(
p_id int auto_increment primary key,
name varchar(20)
);

CREATE TABLE Exercise_Personal_List
(
e_id_m int auto_increment primary key,
p_id_m int
);


INSERT INTO Exercise
(e_id, name)
VALUES
("1", "exercise1"),
("2", "exercise2"),
("3", "exercise3"),
("4", "exercise4"),
("5", "exercise5"),
("6", "exercise6");

INSERT INTO PersonalList
(p_id, name)
VALUES
("1", "list1"),
("2", "list2"),
("3", "list3");

INSERT INTO Exercise_Personal_List
(e_id_m, p_id_m)
VALUES
("2", "1"),
("4", "1"),
("6", "1"),
("1", "2");
  • Table d'exercice: une collection d'exercices
  • Table PersonalList: une collection de liste
  • Exercise_Personal_List: référence à laquelle Exercise_Personal_List fait partie de l'exercice.

J'essaie d'obtenir une liste d'exercices qui ne sont pas encore ajoutés à une liste spécifique. Par exemple, ceux qui ne sont pas ajoutés à la liste 1. Ma requête:

select * from Exercise
where e_id not in (
select e_id from Exercise_Personal_List
where p_id_m like "1"
)

Le résultat est vide. Je ne vois pas l'erreur dans la requête. Le résultat correct devrait être 1, 3, 5.

Btw, je "m utilise http://sqlfiddle.com pour évaluer ce genre de choses. C'est plus rapide pour les tests :)

Merci de votre aide!

Réponses:

2 pour la réponse № 1

Je pense que vous voulez dire faire la requête suivante où la deuxième instance de e_id a été changé pour e_id_m:

select * from Exercise
where e_id not in (
select e_id_m from Exercise_Personal_List
where p_id_m like "1"
)

0 pour la réponse № 2

Il y a un peu de désordre dans la création - vous ne devriez pas utiliser auto_increment dans la table de jonction:

CREATE TABLE Exercise_Personal_List
(
e_id_m int,
p_id_m int
);

Et la sélection devrait être:

select * from Exercise
where e_id not in (
select e_id_m as e_id from Exercise_Personal_List
where p_id_m like "1"
)