[MySQL] - Sélectionner enregistrements qui ne sont pas ailleurs

- Sélectionner enregistrements qui ne sont pas ailleurs [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 08-04-2019 à 16:04:15    

Bonjour,
 
J'ai en résumé 2 tables:
MODULES: id, nom, couleur
USERS2MODULES: id_user, id_module, actif
 
Lorsqu'on donne pour la première fois un accès à un module à un utilisateur, un enregistrement est créé dans la table USERS2MODULES avec "actif" à 1.
Si on souhaite désactiver l'accès au module à un utilisateur, afin d'éviter de perdre des résultats d'exercices (dont je ne parle pas ici), on ne supprime pas l'enregistrement mais on passe "actif" à 0.
 
Je souhaite, grâce à une requête pour voir récupérer la liste des modules auxquels un utilisateur n'a pas accès.
Il y a donc 2 possibilités:
- Il faut sélectionner tous les modules qui n'ont pas d'enregistrement dans USERS2MODULES pour l'utilisateur demandé
- Il faut aussi retourner les modules qui ont un état "actif" à 0 dans USERS2MODULES
 
Pour le moment j'arrive à faire soit l'un, soit l'autre mais pas les deux. Je chercher une solution depuis un moment sans y parvenir.
 
Par avance, merci pour votre aide!

Reply

Marsh Posté le 08-04-2019 à 16:04:15   

Reply

Marsh Posté le 08-04-2019 à 16:21:35    

Utilises LEFT JOIN dans la première requête à laquelle, via un UNION, tu vas faire une seconde requête qui, elle, va chercher les actifs à 0.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 08-04-2019 à 19:56:32    

+1 ;)
si tu as deja trouvé les 2 requetes, tu peux par exemple faire :
Requete 1 UNION Requete 2

Reply

Marsh Posté le 09-04-2019 à 10:03:55    

Un UNION, tout simplement…
C'est fou, je n'y pense jamais à ça alors que c'est si simple au final.
 
Bref, c'est réglé:
 

Code :
  1. SELECT
  2.                     m.id AS id,
  3.                     m.nom AS nom,
  4.                     m.couleur AS couleur
  5.                 FROM
  6.                   modules m
  7.                 LEFT JOIN
  8.                   users2modules u2m
  9.                   ON m.id = u2m.id_modules
  10.                   AND u2m.id_user = :user_id
  11.                 WHERE
  12.                   u2m.id_modules IS NULL
  13.                 UNION
  14.                 SELECT
  15.                   m.id AS id,
  16.                   m.nom AS nom,
  17.                   m.couleur AS couleur
  18.                 FROM
  19.                   modules m
  20.                 INNER JOIN
  21.                   users2modules u2m
  22.                   ON u2m.id_modules = m.id
  23.                   AND u2m.actif = 0
  24.                   AND u2m.id_user = :user_id
  25.                 ORDER BY
  26.                   nom ASC


 
Merci! :)

Reply

Marsh Posté le 09-04-2019 à 10:39:17    

À mon avis il y a moyen de faire plus simple avec un JOIN (FULL JOIN ?) et du filtrage, mais je ne suis pas expert en SQL et je n'ai pas envi de tester.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-04-2019 à 12:01:50    

Ah, le gars bosse sur du Oracle j'ai l'impression.
Des fois, vaut mieux 2 requêtes simples avec un UNION plutôt qu'une requête complexe qui sera plus lente et plus compliquée à faire évoluer ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-04-2019 à 12:23:12    

Oui ce n'est pas faux, c'est un peu comme les expressions régulières, parfois tu peux faire tout d'un coup mais au final c'est bien plus couteux.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed