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 № 1Je 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"
)