Page 1 sur 1
PB RQ exclusive sur 2 critères
Posté : 14 sept. 2005, 09:10
par HiSy
Bonjour
Je me heurte à une requete qui dépasse mon niveau ...
J'essaye d'expliquer :
J'ai une table AA contenant une liste de numéros et une table BB contenant aussi des numéros mais affectés à une lettre.
Je voudrais la liste des numéros de la table AA qui ne sont pas affecté à une lettre donnée dans la table BB.
Exemple :
AA : 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9
BB : 1A ; 1B ; 2C ; 3D; 3C; 4E; 4B; 5A; 5F ;
Soit A la lettre donnée, je voudrais récupérer : 2 ; 3 ; 4
Je veux donc exclure 1 et 5 parce qu'il existe les coupes 1A et 5A dans la table BB...
Le tout réalisé dans un envirronement MySQL 4.0.15 ( Pas de sous requete )
Merci par avance
Posté : 14 sept. 2005, 09:46
par Vaedan
je n'ai aucune idée sur la manière d'obtenir ceci ! je te propose cependant une alternative en PHP
//
// On suppose que les données ont été récupérées puis
// classées dans un tableau de la manière suivante :
// ARRAY[ CONTENU ] = true
//
// ex: $row_BB[ '2C' ] = true;
//
// Contenu de la tableau AA
$row_AA = array( ... );
// Contenu de la tableau BB
$row_BB = array( ... );
foreach ( $row_BB as $nb => $flag )
{
// On suppose que le champ contenant le nombre
// s'appelle 'nb'
preg_match( '°^([0-9]+)[a-z]+$°i', $nb, $tmp );
// On récupère ainsi le nombre qui est suivi d'une lettre
if ( isset( $row_AA[ (string)$tmp[ 0 ] ] ) )
echo '<b>', $nb, '</b> est présent dans AA', "\n";
}
Je me suis mal exprimé ...
Posté : 14 sept. 2005, 10:09
par HiSy
Je me suis surement mal exprimé .
Dans ma table BB j'ai 2 champs ( entre autres )
Le premier contenant le numéro et le second contenant la lettre.
L'idée de traiter ca avec des tableaux me semble un peu difficile à réaliser ... D'autant que je peux avoir des centaines de cas ...
Merci quand meme ...
Posté : 14 sept. 2005, 10:21
par Vaedan
serait-il possible d'avoir la structure complete des tables en MySQL stp ?[/code]
Posté : 14 sept. 2005, 10:32
par Cyrano
Bon, je ne sais pas si ça fonctionne, je n'ai pas testé, mais grosso modo, il faut faire ça en deux requêtes. La première récupère la liste des chiffres de la première able et on met la liste des résultats dans un tableau indexé. Avec ce tableau, on construit dynamiquement une seconde requête sur la table BB : voici une proposition, je ne garantis cependant rien, j'ai un doute sur l,acceptation du NOT LIKE avec MySQL 4.0, à tester :
<?php
/* On récupère les chiffres existat dans la première table */
$sql1 = "SELECT numero FROM AA";
$chiffres = array();
$requete1 = mysql_query($sql1);
while($ligne = mysql_fetch_assoc($requete1))
{
$chiffres[] = $ligne['numero'];
}
/* On crée une variable de test */
$lettre = "A";
/* On construit dynamiquement une seconde requête */
$sql2 = "SELECT numero
FROM BB
WHERE numero LIKE '". $lettre ."%'";
foreach($chiffres as $chiffre)
{
$sql2 .= " AND numero NOT LIKE ". $lettre . $chiffre;
}
/* Exécution de la requête */
$requete2 = mysql_query($sql2);
$liste = array();
/* Récupération de la liste de résultats */
while($ligne2 = mysql_fetch_assoc($requete2))
{
$liste[] = $ligne2['numero'];
}
?>
Posté : 14 sept. 2005, 10:43
par Ripat
Ceci ?
Code : Tout sélectionner
SELECT *
FROM aa
LEFT JOIN bb ON CONCAT(aa.id, 'A') = bb.col
WHERE bb.col IS NULL
Posté : 14 sept. 2005, 11:13
par Cyrano
lol, bon ok, je vais me cacher

Posté : 14 sept. 2005, 11:22
par HiSy
Y'a de l'idée
Si j'adapte la requete à mon structure de base :
Code : Tout sélectionner
SELECT *
FROM aa
LEFT JOIN bb ON CONCAT(aa.id, 'A') = CONCAT(bb.colChiffre, bb.colNombre )
CONCAT(bb.colChiffre, bb.colNombre )
IS NULL
Posté : 14 sept. 2005, 11:23
par HiSy
Trop content d'avoir inserer du code ... J'ai oublié de finir mon tips :
Ca marche pas ...

Posté : 14 sept. 2005, 12:15
par Ripat
N'aurais-tu pas oublié le WHERE ?
Sinon fais un SHOW CREATE TABLE aa et bb. Poste le résultat avec quelques valeurs type et j'essaye chez moi.