Trier à partir d'un 1ère requête

Résolu/Fermé
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 - Modifié par maxireussite le 15/09/2013 à 06:41
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 - 4 oct. 2013 à 23:46
Salut les amis,

Le bleu de service est de retour !

J'ai une 1ère requête qui trie id sur des champs date. JE souhaiterais avec les résultats de cette 1ère requête trier dans la table client les champs id et nom.

Comment dois-je m'y prendre ?

MErci.

15 réponses

ryko1820 Messages postés 1677 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 15/09/2013 à 12:44
Hello,

je suis pas sûr d'avoir compris ta question mais le plus simple à mon avis est de le faire dans le SQL :

SELECT supplier_city, supplier_state
FROM suppliers
WHERE supplier_name = 'IBM'
ORDER BY supplier_city DESC, supplier_state ASC;

Voir par exemple sur TechOnTheNet.com (le premier qui sort dans Google) SQL: ORDER BY Clause

You may stop me but you can't stop us all ;-)
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
15 sept. 2013 à 23:50
MErci Ryko 1820,

Plus simple ? Je ne sais pas !
J'ai besoin du résultat de la 2è requête pour une zone liste php.
Donc il me semple que cela doit se passer dans mon formulaire, non ?

Voilà ma 1ère requete :

$requete = mysql_query("SELECT DISTINCT code_client FROM oc_aexpedier WHERE TO_DAYS(NOW()) - TO_DAYS(date_aexpedier) <= 10 ORDER BY code_client ASC") or die("Pb avec la requette ".mysql_error());

Avec ces résultats, je souhaiterais pouvoir "attaquer" une autre table (oc_clients) pour en extraire des noms.

La 1ère me donne le code_client, la 2ème le nom.

Il s'agit de les utiliser dans une zone de liste d'après la 2ème requête.
0
ryko1820 Messages postés 1677 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 16/09/2013 à 08:29
Hello,

c'est du pur SQL, je manque un peu de pratique mais tu devrais pouvoir avoir ton résultat en une seule requête ...

Est-ce que tu connais les jointures (INNER JOIN, LEFT, RIGHT et FULL OUTER JOIN) ? C'est fait pour ça ...

Je présume que ton code_client se retrouve aussi dans la seconde table ?





You may stop me but you can't stop us all ;-)
0
gign44 Messages postés 124 Date d'inscription dimanche 27 janvier 2008 Statut Membre Dernière intervention 22 octobre 2013 5
Modifié par gign44 le 16/09/2013 à 09:30
Bonjour,

Cela te donnera une requête similaire à celle ci :


SELECT DISTINCT C.code_client, D.nom_client
FROM oc_aexpedier C, ta_deuxieme_table D
WHERE C.code_client = D.code_client
AND C.TO_DAYS(NOW()) - C.TO_DAYS(date_aexpedier) <= 10
ORDER BY C.code_client ASC

Cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
17 sept. 2013 à 05:35
Merci aux deux derniers post, je vais essayer, je vous dirais ce que ça donne.
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
Modifié par maxireussite le 30/09/2013 à 02:59
gign44,

J'essaie d'appréhender ton code, mais code_client et nom ne sont pas dans la table oc_aexpedier... Dans cette table je ne peux extraire que code_client.

Justement à partir de code_client de oc_aexpedier je dois sélectionner les noms dans la seconde table (oc_clients).
0
ryko1820 Messages postés 1677 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 30/09/2013 à 07:17
 
Tu as bien code_client dans les 2 tables ?

Parce qu'à cette question cette phrase
code_client et nom ne sont pas dans la table oc_aexpedier... Dans cette table je ne peux extraire que code_client.
répond oui et non ...

Si oui la jointure peut fonctionner, sinon il y a un problème car ce n'est que sur cette colonne que peut s'établir la relation entre les 2 tables (d'après ce que nous savons de tes tables).

Ça dans phpmyadmin, ça fonctionne ou pas ?

SELECT DISTINCT C.code_client, D.nom_client
FROM oc_aexpedier C, oc_clients D
WHERE C.code_client = D.code_client
AND C.TO_DAYS(NOW()) - C.TO_DAYS(date_aexpedier) <= 10
ORDER BY C.code_client ASC
 
0
gign44 Messages postés 124 Date d'inscription dimanche 27 janvier 2008 Statut Membre Dernière intervention 22 octobre 2013 5
30 sept. 2013 à 09:03
Il te faut obligatoirement une colonne commune entre tes 2 tables, si ce n'est pas le cas, crée une colonne FK code_client dans ta deuxieme table, ce sera le plus simple
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
Modifié par maxireussite le 30/09/2013 à 19:01
Ben oui, la colonne commune c'est "code_client".

Ma première (voir plus haut) requête détermine les "code_client" de la table oc_aexpedier;

la seconde doit me permettre de terminer à partir de code_client les "noms" dans oc_clients... qui elle contient bien "code_client" et "nom".

Voilà qui devrait être plus clair, non ?
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
1 oct. 2013 à 05:52
Alain42,

Ne serais-tu pas dans les parages ? Ton aide me serait précieuse...

Là ça commence à urger pour moi, lol !
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
1 oct. 2013 à 11:24
Salut,

As tu essayé les solutions proposées par ryko1820 et gign44 ?

Voici un équivalent en utilisant les jointures :

SELECT D.nom
FROM oc_clients D
LEFT JOIN oc_aexpedier C ON C.code_client = D.code_client
WHERE TO_DAYS(NOW()) - TO_DAYS(C.date_aexpedier) <= 10
ORDER BY D.nom ASC

Sinon voici une autre façon de faire en utilisant une sous requête (cette solution est plus compréhensible mais moins optimisé, je te conseil d'utiliser une jointure si tu peux) :

SELECT nom
FROM oc_clients
WHERE code_client IN (
SELECT DISTINCT code_client
FROM oc_aexpedier
WHERE TO_DAYS(NOW()) - TO_DAYS(date_aexpedier) <= 10
ORDER BY code_client ASC
)

Bonne journée
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
1 oct. 2013 à 13:18
Merci les amis.

Je regarde cela et je reviens vers vous.
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
4 oct. 2013 à 02:58
@Pitet,

J'ai choisi la solution qui me paraissait la plus simple, car dans la une les "C & D" me pertubent :)..

Peux-tu me dire stp ce qui cloche ici :

"$requete = mysql_query "SELECT nom FROM oc_clients WHERE code_client IN (SELECT DISTINCT code_client FROM oc_aexpedier
WHERE TO_DAYS(NOW()) - TO_DAYS(date_aexpedier) <= 10 ORDER BY code_client ASC);
"

Merci.
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
4 oct. 2013 à 09:50
Tu as oublié les parenthèses de la fonction mysql_query et les guillemets doivent être placé autour le requête sql :

$requete = mysql_query("SELECT nom FROM oc_clients WHERE code_client IN (SELECT DISTINCT code_client FROM oc_aexpedier
WHERE TO_DAYS(NOW()) - TO_DAYS(date_aexpedier) <= 10 ORDER BY code_client ASC)");

Pour les premières solutions proposées, "C" et "D" sont des alias de tables.
Pour que tu comprennes, essayons la requête suivante :

SELECT code_client FROM oc_clients, oc_aexpedier

Il y a une ambiguïté sur cette requête car mysql ne sait pas quel colonne code_client il doit récupérer : celle de oc_clients ou celle de oc_aexpedier ?

Pour lever l'ambiguïté, on précise la table devant notre champ à sélectionner, par exemple on demande le code client de la table oc_clients :

SELECT oc_clients.code_client FROM oc_clients, oc_aexpedier

Ici la requête est courte, mais pour des requêtes plus complexe, ajouter le nom de la table devant chaque champ ambigüe peut vite rendre la requête illisible.
On utilise donc un alias de table :

SELECT a.code_client FROM oc_clients a, oc_aexpedier

Ici l'alias de la table code_client est "a", tu peux lui donner le nom que tu souhaites.


Pour ton code, on peut la faire la requête avec jointure sans alias :

SELECT oc_clients.nom
FROM oc_clients
LEFT JOIN oc_aexpedier ON oc_aexpedier.code_client = oc_clients.code_client
WHERE TO_DAYS(NOW()) - TO_DAYS(oc_aexpedier.date_aexpedier) <= 10
ORDER BY oc_clients.nom ASC
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
4 oct. 2013 à 13:07
Merci bcp Pitet.

Je prends tout le temps nécessaire d'examiner tout cela et je reviens te dire ce qu'il en est.

Merci bcp pour tout l'explicatif.
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
4 oct. 2013 à 23:40
Me v'là au rapport !

Bon en fait j'ai besoin de cette requête pour alimenter une zone de liste.

J'ai cette formule là pour cette requête qui fonctionne très bien, car les deux champs sont dans la même table :

"$requette = mysql_query("SELECT code_client,nom FROM oc_clients ORDER BY code_client ASC") or die("Pb avec la requette ".mysql_error());"

Voilà le script de la zone de liste qui dans ce cas fonctionne :

"?><select name="code_client" style="width: 159px">

<option selected="selected"></option>

<?php
while ($valeur = mysql_fetch_array($requette)){
echo "<option value=\"". $valeur['code_client'] ."\" cli_name=\"". $valeur['nom'] ."\">". $valeur['code_client'] ."   ". $valeur['nom'] ."</option>n";
}
?>

Je garde donc ce dernier script et je modifie la requête avec les conseilles de Pitet, mais cela ne marche pas...

Pouvez-vous me dire, svp, comment concilier les deux ? sachant que la sélection se fait sur le code client, le nom doit apparaître juste pour éviter les erreurs.

Merci mille fois.
0
maxireussite Messages postés 372 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 11 mars 2020 5
4 oct. 2013 à 23:46
Oup's ! Je n'ai rien dit ! En fait cela marche au poil..

J'ai une erreur dans la recopie de "requete" et il faut rajouter code_client dans :
"...SELECT nom FROM oc_clients WHERE code_client IN ...
0