Aller au contenu

Tri d'un requête après un while


Sujets conseillés

Posté

Bonjour,

Je viens vous voir totalement desepéré après de multiples recherches sur google. J'ai un problème pour le tri du résultat d'un requête SQL.

Je vais essayer d'être clair.

J'ai inséré des produits dans une base de donnée sql. Les marques sont stockés dans une table différente des produits. Donc par exemple pour un produit de marque Microsoft (id n°1 dans la table 'marques'), le champ marque dans la table de ce produit est 1.

Quand j'affiche la fiche du produit en question je regarde l'iD de la marque ($_GET) et je vais récupérer le nom de la marque dans la table marques.

Malheureusement quand je liste toutes les marques qui apparaissent dans la la table produits (donc toutes les marques utilisées), je n'arrive pas à les trier.

Voici mon code :

<?php
$erreur='Aucune marques référencées pour le moment.';
$select = "SELECT count(id) FROM telephones WHERE type !='accessoires'";
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0];

$select = "select * FROM telephones WHERE type != 'accessoires' GROUP BY marques";
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );

if($total)
{
while ($donnees = mysql_fetch_array($result) )
{
?>
<a href="index.php?page=marques&marque=<?PHP echo "$donnees[marques]" ?>" class="menu_gauche">
<?PHP
$select2 = "select * FROM marques WHERE id='$donnees[marques]'";
$result2 = mysql_query($select2) or die ('Erreur : '.mysql_error() );
$donnees2 = mysql_fetch_array($result2);
echo "$donnees2[marques]"

?></a>
<?PHP
}
}
else echo "<left>$erreur</left>";
mysql_free_result($result);
?>

J'ai cherché mais sans succès ou je ne comprends pas.

Auriez vous une piste s'il vous plait ?

Toutes critiques sur mon code est la bienvenue.

Merci par avance.

Posté

Salut,

Si je comprends bien $donnees[marques] retourne bien quelque chose mais pas $donnees2[marques] ?

En faisant un jointure de table c'est pas plus simple?

A+

Posté
Salut,

Si je comprends bien $donnees[marques] retourne bien quelque chose mais pas $donnees2[marques] ?

En faisant un jointure de table c'est pas plus simple?

A+

Merci pour votre réponse.

$donnees[marques] retourner le numéro de la marque

$donnees2[marques] retourne le nom de la marque grace à $donnees[marques]

Durant mes cours de base de données, on m'avait expliqué qu'on pouvait faire en sorte que les collones d'une table soit inséré virtuellement dans une autre table. Est ce cela une jointure de table ?

INNER JOIN ??

Merci par avance

SI oui quelle est la fonction à utiliserr

Posté (modifié)

Rebonjour,

J'ai cherché et peut être trouvé quelque chose : les requetes imbriquées.

Voici mes tables (en gros) :

TABLES marques :

id | marques

---------------

1 | Nokia

2 | Ericsson

3 | Motorola

TABLE telephones

id | marques | ref

---------------

...

4 | 1 | N95

5 | 2 | T28

Je recherche à obtenir la liste triée des marques utilisées dans le table telephones. Le résultat devrait être le suivant :

- Ericsson

- Nokia

J'ai fait cette requete :

$select = "SELECT id,marques FROM marques WHERE marques IN(SELECT marques FROM telephones GROUP BY marques)";
$result = mysql_query($select);


if($total)
{
while ($donnees = mysql_fetch_array($result) )
{
echo "$donnees[id]";
?>

Mais rien ne s'affiche.

Voyez vous quelque chose qui cloche ?

Merci par avance.

Modifié par aodot
Posté

Une bête jointure et tu obtiens ce que tu veux :

$select = mysql_query("SELECT telephones.marque, marques.marques 
FROM telephones
LEFT JOIN marques ON telephones.marque = marques.id")or die(mysql_error());

while ($donnees = mysql_fetch_assoc($select))
{
echo $donnees['marques'];
}
?>

Avec les tables suivantes :

CREATE TABLE `telephones` (
`id` mediumint(9) NOT NULL auto_increment,
`marque` varchar(30) NOT NULL,
`ref` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3;

--
-- Contenu de la table `telephones`
--

INSERT INTO `telephones` (`id`, `marque`, `ref`) VALUES
(1, '1', 'n65'),
(2, '2', 'i63');

CREATE TABLE `marques` (
`id` mediumint(9) NOT NULL auto_increment,
`marques` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3;

--
-- Contenu de la table `marques`
--

INSERT INTO `marques` (`id`, `marques`) VALUES
(1, 'nokia'),
(2, 'sagem');

Ça me renvoie "nokiasagem" (j'ai pas mis de saut de ligne comme tu as pu le remarquer ^^ )

Posté

Alors la merci pour votre réponse.

J'ai réussi à obtenir ce que je voulais en ajoutant un group by et un order by :

$select = mysql_query("SELECT telephones.marques, marques.marques, marques.id FROM telephones LEFT JOIN marques ON telephones.marques = marques.id WHERE telephones.type != 'accessoires' GROUP BY telephones.marques ORDER BY marques.marques")or die(mysql_error());

Malheureusement je n'ai pas tout compris dans cette requête. Serait-il possible de m'indiquer la méthode de réflexion pour comprendre cette requete ? J'en demande peut être trop mais vous inquiétez pas je vais chercher.

Encore merci et à bientôt.

Posté

Bah le principe c'est de relier les données des deux tables entre elles suivant certaines conditions, en l'occurrence là on join la table "marques" et l'on sélectionne donc la table "telephones" seulement lorsque l'id de la marque du téléphone est égale à l'id d'une des marques de la table "marques".

Bon je ne suis pas bien doué pour expliquer certes ... Pour faire ça de façons schématique, tu as deux tables :

  • telephones
    • id
    • marque
    • ref

    [*]marques

    • id
    • marques

Avec une jointure basique où nous sélectionnerions tout (avec jointure) nous obtiendrons ceci :

  • Résultat de la requête
    • Telephone.id
    • Telephone.marque
    • Telephone.ref
    • Marques.id
    • Marques.marques

Si tu ne comprends pas le principe, il y a des tutoriaux sur internet assez bien pour les jointures si je me rappelle bien.

Posté

Bonjour,

Je comprends un peu mieux mais je vais essayer d'approfondir un peu en cherchant un tutorial.

Merci encore.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...