[SQL] Trouver le mauvais id

WRInaute passionné
Bonjour,

Comment à partir d'une liste d'identifiants, trouver celui qui n'existe pas dans une table.

Par exemple,
1;2;3;4;5;6;7;8;9;10
Je veux, à partir d'une requête, pouvoir déterminer quels sont les id qui n'existe pas dans la base.

Avec des COUNT, GROUP BY, ... ?

Merci
 
WRInaute accro
Facile

Tu as tes ids à chercher dans une table table_a_trouver(id) par exemple ( on suppose qu'il n'y a pas d'autres champs dans la table, mais ça n'a pas d'importance ).

Tu as tes ids à exclure dans un autre table table_a_exclure(id) ( même chose ).

Voici l'ordre SQL qui fournit les id de la première table, ne se trouvant pas dans la deuxième table:

SELECT id FROM table_a_trouver WHERE id NOT IN(SELECT id FROM table_a_exclure);

Facile non ?

Le premier id est le champ de la table table_a_trouver.

Le deuxième id est le champ de la table table_a_exclure.

Ces deux champs pourraient avoir un nom différent l'un de l'autre, il suffirait de changer l'ordre SQL "accordingly", comme disent nos amis les Anglais. ;)

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
Cette solution va me retourner tous les id de la table_a_trouver qui ne sont pas dans table_a_exclure.

Hors je souhaite trouver l'id d'une liste textuelle (la table_a_exclure) qui n'est pas dans la table (table_a_trouver).

Merci
 
WRInaute passionné
Il suffit donc de faire l'inverse

SELECT id FROM table_a_exclure WHERE id NOT IN(SELECT id table_a_trouver);

ça te donnera tous les id de la table à exclure qui ne sont pas dans le table à trouver
 
WRInaute accro
druart a dit:
Il suffit donc de faire l'inverse

SELECT id FROM table_a_exclure WHERE id NOT IN(SELECT id table_a_trouver);

ça te donnera tous les id de la table à exclure qui ne sont pas dans le table à trouver


Bonjour druart

Et le FROM ?

C'est pas pour dire, mais... ;)

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
ortolojf a dit:
druart a dit:
Il suffit donc de faire l'inverse

SELECT id FROM table_a_exclure WHERE id NOT IN(SELECT id table_a_trouver);

ça te donnera tous les id de la table à exclure qui ne sont pas dans le table à trouver


Bonjour druart

Et le FROM ?

C'est pas pour dire, mais... ;)

Bien à vous.

Amicalement.

Jean-François Ortolo


Cher Monsieur,
Je suis très heureux : en effet je voulais m'assurer que vous suiviez :)

alors je recommence donc :

SELECT id FROM table_a_exclure WHERE id NOT IN(SELECT id FROM table_a_trouver);
 
WRInaute accro
druart a dit:
Cher Monsieur,
Je suis très heureux : en effet je voulais m'assurer que vous suiviez :)

alors je recommence donc :

SELECT id FROM table_a_exclure WHERE id NOT IN(SELECT id FROM table_a_trouver);


Bonsoir Monsieur

N'est-ce pas... ;)

Sur le plan sémantique, on sélectionne les id de table_a_exclure, pour exclure les id de table_a_trouver.

Bof, je me ferai une raison, de ne pas confondre la sémantique et la sémiologie.

Deux choses différentes... ;)

Cependant... Attention ! Quelle est la Science qui permet de distinguer le sens du mot "sémantique", du sens du mot "sémiologie" ? Hein ? Hein ?

Y a bug... ;(

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
Ne soyez pas amère, certes le nom des tables n'est peut-être pas à propos.
Toutefois ce n'est pas le plus important, la sémantique n'a pas vraiment sa place dans ce contexte : l'important est comme vous l'avez fait de tendre la main à un pauvre requêteur en détresse. Soyez-en remercié :mrgreen:

Voilà que je lance du vous maintenant sur le wri ... ça va me perturber :)
 
WRInaute passionné
Code:
SELECT id FROM table_a_exclure WHERE id NOT IN(SELECT id FROM table_a_trouver);

Merci pour vos réponses, mais je précise bien que mes id à exclure ne sont pas stocké dans une table.

C'est une liste de valeurs récupérées ?

Donc comment faire.

Merci.
 
WRInaute passionné
Soit.
Il va falloir donc nous préciser sous quel format cette liste est récupérée (une variable, un tableau ?)
Un exemple pour agrémenter serait bien plus rapide.
 
WRInaute passionné
Aucune importance, je sais manipuler les données.

Cela impose juste que ne peux pas exploiter une solution avec une table (table_a_exclure) car j'ai des données textuelles (mais je peux les formater comme je veux dans une requête).
 
WRInaute accro
dorian53 a dit:
Aucune importance, je sais manipuler les données.

Cela impose juste que ne peux pas exploiter une solution avec une table (table_a_exclure) car j'ai des données textuelles (mais je peux les formater comme je veux dans une requête).


Bonjour dorian53

Je te propose de mettre tes id dans une chaîne de caractères de la forme:

$a_exclure = "( id1, id2, id3, etc... )";

Donc, une chaîne de caractère composée des id séparés par des virgules, et entourée par une parenthèse ouvrante, et une parenthèse fermante. ( Ne pas oublier les parenthèses ).

Ce sera à toi de former cette variable chaîne de caractères à partir de tes id, quelle que soit la façon dont ceux-ci sont stockés au départ. Ces id sont chacun des nombres ( je suppose ), ou des chaînes de caractères sans espace ( possible aussi ).

Donc, voici l'instruction qui affecte à la variable de requête $sql , la chaîne de caractère qui contiendra la requête SQL recherchée:

$sql = "SELECT id FROM table WHERE id NOT IN" . $a_exclure;

Remarque: Il ne doit pas y avoir d'espace entre le mot IN et la quote terminale de la première chaîne de caractères ( commençant par SELECT ).

C'est aussi simple que ça...

D'ailleurs, tu aurais pu tester la syntaxe de cette requête SQL, sous phpMyAdmin sur ton hébergement, en lançant des requêtes SQL en dur, sans aucun souci.

Après, la variable $sql peut très bien être mis en paramètre à une instruction de la forme:

mysql_query($sql, $conn);

Je te passe les problèmes de gestion d'erreur MySQL, c'est un problème annexe.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
Salut mais c'est la même problématique que la réponse précédente.

Cette solution va me retourner tous les id de la table qui ne sont pas dans la liste d'id.

Hors je souhaite trouver l'id de la liste textuelle qui n'est pas dans la table.

Merci
 
WRInaute impliqué
Tu disposes donc déjà d'un array.
Pourquoi ne pas parcourir et extraire les ids de ta table, les stocker dans un 2° array, pour obtenir au final 2 arrays ?
et ensuite "comparaison tableaux php" dans google ou mieux, la lecture de ces fonctions sur les tableaux t'aidera à aboutir à ce que tu veux.. :wink:
 
WRInaute accro
dorian53 a dit:
Une 50aine d'éléments.


Bonjour dorian53

Dans ce cas, seul un programme itératif avec une boucle sur l'array des id, pourra résoudre le problème.

...A moins que tu ne mette cette array dans une table temporaire, ce qui équivaut à la solution précédente.

Donc, voici un code qui met dans une array $id_trouve[] tous les id de l'array $id_a_trouver[] ( ton array ) qui ne sont pas dans la table table:

$id_trouve = array();

foreach($id_a_trouver as $id) {

unset($sql);
$sql = "SELECT COUNT(*) FROM table WHERE id=" . $id;

unset($res);
$res = @mysql_query($sql, $conn);
// Traitement d'erreur éventuel...

unset$row);
$row = @mysql_fetch_row($res);

unset($nbre);
$nbre = 0 + $row[0];

// Pas la peine de spécifier l'indice,
// il se met automatiquement.
if($nbre == 0)
$id_trouve[] = $id;

@mysql_free_result($res);
}

// Voilà, maintenant tu as dans $id_trouve
// Tous les id se trouvant dans $id_a_trouver[],
// et qui ne sont pas dans la table table.
//
// Pour parcourir cette array:
reset($id_trouve);

foreach($id_trouve as $id) {

// Chaque id est dans $id
}


Facile !

Cela n'est possible, que parce que la dimension de l'array $id_a_trouver[] est faible...

En fait, cette architecture de données est assez bonne.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
Ok, aucun soucis pour ce raisonnement mais c'était vraiment le fait de savoir s'il y avait une solution via une seule requête SQL que je cherchais à savoir.

J'en conclue que non ?

Merci à vous d'avoir participé à cette discussion.
 
WRInaute accro
dorian53 a dit:
Ok, aucun soucis pour ce raisonnement mais c'était vraiment le fait de savoir s'il y avait une solution via une seule requête SQL que je cherchais à savoir.

J'en conclue que non ?

Merci à vous d'avoir participé à cette discussion.


Bonsoir dorian53

Mettons que tu ais tes id dans une array, ou dans une chaîne de caractères avec la virgule comme séparateur ( ou le point virgule ).

Comment veux-tu tester ce que tu veux avec une seule requête SQL ?

Il faudrait à ce moment-là, une fonction MySQL d'évaluation d'une chaîne de caractère, qui fasse à la fois regexp, et extraction de chacun des id de la chaîne de caractère...

La fonction REGEXP existe bien en MySQL, mais je ne vois pas comment extraire avec une fonction MySQL, les élément d'une chaîne de caractère séparés par un caractère séparateur.

Merci à ceux qui savent de me détromper.

Le propre d'un table SQL, c'est de pouvoir faire des comparaisons sur chaque row ( lignes ) d'une table, indépendamment des autres lignes.

Mais des enregistrements dans une chaîne de caractères, dur, dur...

Bien à vous.

Amicalement.

Jean-François Ortolo
 
Discussions similaires
Haut