L'id du fichier n'existe pas dans la table rubrique [SQL] - SQL/NoSQL - Programmation
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.
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 ?
Marsh Posté le 12-09-2002 à 09:47:12
Code :
|
voici ma requete et ça marche pas :'(
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.
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
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
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...
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
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
Message édité par manuuu le 11-09-2002 à 18:09:26