[SQL] L'id du fichier n'existe pas dans la table rubrique

L'id du fichier n'existe pas dans la table rubrique [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 11-09-2002 à 18:08:22    

j'explique....
j'ai deux tables liées :
 
fichiers
et  
rubriques
 
dans fichier ya un champ : id_rub, qui en fait, dis à quelle rubrique est attaché le fichier
 
j'aimerai faire une requete, pour :  
chercher dans rubrique les id_rub qui ne corréspondent à rien
 
genre j'efface l'id "3" de la table rubrique, je vais avoir des fichiers avec "id_rub" qui existent toujours
j'en veux la liste...
 
en gros, je recherche les orphelins et je veux conserver la liste
 
je m'exprimer mal c grave
 
mais bon, please, aidez moi !!
merci :D


Message édité par manuuu le 11-09-2002 à 18:09:26
Reply

Marsh Posté le 11-09-2002 à 18:08:22   

Reply

Marsh Posté le 11-09-2002 à 18:28:41    

oui tu t'exprimes mal  ;)  
 
Mais si j'ai compris ta demande pour les orphelins, essaye ça:
select * from fichier
where id_rub not in (select id_rub from rubrique)
 
Il y a plein d'autres moyens de faire la même chose.
Ca dépend aussi du dialecte SQL que t'utilises (quelle DB?)
Le mieux quand même est de mettre un containte d'intégrité sur id_rub, comme ça t'évites de créer des orphelins dans fichier.
 

Reply

Marsh Posté le 11-09-2002 à 23:54:40    

salut et merci
c quoi intégrité ?
en fait c du mysql
et je veux verifier par rapport à deux bases
 
comment faire la liaison ?

Reply

Marsh Posté le 12-09-2002 à 09:47:12    

Code :
  1. select DISTINCT site_fichiers.nom_fichier,
  2.                 site_fichiers.titre_fichier,
  3.      site_fichiers.id_fichier,
  4.                 site_fichiers.id_rubrique,
  5.                 site_rubriques.id_rubrique, 
  6.        SUBSTRING(titre_fichier,1,30) as titre_reduit2
  7.      FROM site_fichiers, site_rubriques
  8.  WHERE site_fichiers.id_rubrique NOT IN site_rubriques.id_rubrique
  9.        ORDER by nom_fichier


 
voici ma requete et ça marche pas :'(


Message édité par manuuu le 12-09-2002 à 09:48:34
Reply

Marsh Posté le 12-09-2002 à 09:52:38    

Je pense que c'est ton "NOT IN" qui ne passe pas. Généralement, on utilise un NOT IN avec un liste entre parenthèses ou une sous-requête.

Reply

Marsh Posté le 12-09-2002 à 09:54:20    

oui je lis la doc là, il me dit de faire:
 
select * FROM site_fichiers WHERE id_rubrique NOT IN (SELECT id_rubrique FROM site_rubriques) ORDER by nom_fichier

Reply

Marsh Posté le 12-09-2002 à 09:56:26    

ok juste au dessus dans la doc ya marqué :  
 
"La requête suivante ne fonctionne par encore sous MySQL"
 
sniiiiiiiiiiiifffffffffffffffff
 
POUR LES INTERESSES voici ce qui fonctionne :  
 
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL


Message édité par manuuu le 12-09-2002 à 09:58:55
Reply

Marsh Posté le 12-09-2002 à 11:02:04    

Bah si le IN ne fonctionne pas sous mysql, c'est bien dommage :(  
désolé, je connais le sql de cette base.
 
Utilise effectivement la jointure externe LEFT JOIN.  
Eventuellement en utilisant une clause d'existence, faut voir si ça passe en mysql et si c'est pas trop long.
En reprenant ta requête du dessus, ça donnerait quelque chose comme ça:
 
select a.nom_fichier,  
       a.titre_fichier,  
       a.id_fichier,  
       a.id_rubrique,  
       SUBSTRING(a.titre_fichier,1,30) as titre_reduit2  
from site_fichiers a  
where not exists (select 'x' from site_rubriques b
                  where b.id_rubrique=a.id_rubrique)  
order by a.nom_fichier  
 
Sinon les contraintes d'intégrité, c'est un des principes des BDD relationnelles permettant de garder une base intègre.
Pour faire simple, ça t'évite les orphelins, ça assure une certaine cohérence des données et ça simplifie la maintenance de la base.
Dans ton cas, id_rubrique de la table site_fichier est une clé étrangère provenant de la table site_rubriques (dans laquelle id_rubrique est alors clé primaire). En mettant une contrainte de clé étrangère sur id_rubrique, tu empêches ainsi l'effacement accidentel des lignes dans site_rubrique dont l'id_rubrique est utilisé dans site_fichier, donc t'évites de faire des orphelins dans site_fichier.
Reste à voir si les contraintes existent sous mysql.
 
a pluche...

Reply

Marsh Posté le 12-09-2002 à 11:13:45    

Agagax a écrit a écrit :

Bah si le IN ne fonctionne pas sous mysql, c'est bien dommage :(  
désolé, je connais le sql de cette base.
 
Utilise effectivement la jointure externe LEFT JOIN.  
Eventuellement en utilisant une clause d'existence, faut voir si ça passe en mysql et si c'est pas trop long.
En reprenant ta requête du dessus, ça donnerait quelque chose comme ça:
 
select a.nom_fichier,  
       a.titre_fichier,  
       a.id_fichier,  
       a.id_rubrique,  
       SUBSTRING(a.titre_fichier,1,30) as titre_reduit2  
from site_fichiers a  
where not exists (select 'x' from site_rubriques b
                  where b.id_rubrique=a.id_rubrique)  
order by a.nom_fichier  
 
Sinon les contraintes d'intégrité, c'est un des principes des BDD relationnelles permettant de garder une base intègre.
Pour faire simple, ça t'évite les orphelins, ça assure une certaine cohérence des données et ça simplifie la maintenance de la base.
Dans ton cas, id_rubrique de la table site_fichier est une clé étrangère provenant de la table site_rubriques (dans laquelle id_rubrique est alors clé primaire). En mettant une contrainte de clé étrangère sur id_rubrique, tu empêches ainsi l'effacement accidentel des lignes dans site_rubrique dont l'id_rubrique est utilisé dans site_fichier, donc t'évites de faire des orphelins dans site_fichier.
Reste à voir si les contraintes existent sous mysql.
 
a pluche...




le in fonctionne, c'est le subselect qui ne sont pas supporte. (donc ta requete passera pas)
Sinon c'est clair que l'utilisation du handler innodb avec MySQL + une foreign key me parait pas mal :)


Message édité par joce le 12-09-2002 à 11:14:44
Reply

Sujets relatifs:

Leave a Replay

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