Mysql : select sur plusieurs tables?

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Recif, 20 Juillet 2011.

  1. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Bonjour,

    Voici mon souci: j'ai 2 ou trois tables avec divers articles. J'aimerai simplement faire une liste commune de tous les articles confondus, triés par date (ou par index primaire). Je trouve plein d'exemple sur le net, mais c'est à chaque fois du relationnel, donc des articles liés à un identifiant se trouvant sur une autre table, ça ne répond donc pas à mon problème...
    Y a t-il une syntaxe qui existe spécifiquement pour ce problème ouo bien il faut faire un array (php) commun à toutes les tables et trier ensuite le tout?...

    Merci
     
  2. UsagiYojimbo
    UsagiYojimbo WRInaute accro
    Inscrit:
    23 Novembre 2005
    Messages:
    12 003
    J'aime reçus:
    128
    Et fusionner tes trois tables en rajoutant un champ pour le typage ?
     
  3. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 847
    J'aime reçus:
    217
    select union devrait répondre à ton problème. mais ça bouffe de la ressource
     
  4. jamalofski
    jamalofski WRInaute discret
    Inscrit:
    3 Mars 2007
    Messages:
    225
    J'aime reçus:
    0
    Pour utiliser "union" les définitions techniques des rubriques récupérés dans les select doivent être identiques entres les différentes requêtes. Si ce n'est pas le cas, il faut faire un cast sinon ça ne marchera pas.

    Si tu me dis que c'est le cas, tu dois te poser la question sur le modèle de ta base et son optimisation et surtout la raison pour la quelle tu crées trois tables identiques au lieu d'utiliser une seule.
     
  5. SaintAmand
    SaintAmand WRInaute discret
    Inscrit:
    1 Mars 2011
    Messages:
    88
    J'aime reçus:
    1
    S'il n'y pas de lignes dupliquées entre les tables, un SELECT UNION ALL est bien plus rapide.
     
  6. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 847
    J'aime reçus:
    217
    On peut aussi les préparer via des opérateurs dans les selects, ce qui permet d'unir des tables avec des définitions de champs différentes (mais je suis d'accord que ce n'est pas l'idéal)
     
  7. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    En fait j'ai trois tables avec trois métiers différents et une liste de personnes (pour la petite histoire, c'était obligatoire car chaque métier a ses spécification, et donc pas les mêmes champs). Il y a quelques champs qui ont le même nom entre les tables.
    Sur la page principale j'aimerais lister les dernières personnes enregistrées mais tous métiers confondus, donc dans les trois tables.
    Par contre si vous pouviez mettre un exemple ça m'arrangerais... :wink:
    Merci
     
  8. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 847
    J'aime reçus:
    217
    Donc le bon modèle de données aurait été une table avec les métiers et les champs communs, et une table annexe pour les spécifs différentes.

    Pour te faire ta requête (puisque c'est ça que tu demandes) il faudrait au moins que tu donnes les specs de tes tables
     
  9. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    C'est plus complexe que ça pour la structure, mais je ne souhaite pas entrer dans les détails, il faut se dire que c'est infaisable.

    Pour deux tables tables:

    Metier 1
    id
    nom
    prenom
    critere1
    date

    Metier 2
    id
    nom
    prenom
    critere2
    date

    J'aimerais avoir la liste des derniers enregistrements triés par date, mais les deux tables confondues...

    - nom / prenom / date
    - nom / prenom / date
    ...
     
  10. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 847
    J'aime reçus:
    217
    SELECTnom AS LENOM, prenom AS LEPRENOM, date AS LADATE from metier 1
    UNION SELECT nom AS LENOM, prenom AS LEPRENOM, date AS LADATE from metier 2
    ORDER BY LADATE DESC

    (bon bien sûr tu n'as pas mis date comme nom de champs mais autre chose)
     
  11. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    C'est UNION? et pas UNION ALL?
     
  12. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    J'ai essayé avec UNION mais j'ai un message d'erreur

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

    requete en php :

    Code:
    $result = mysql_query("select id as IDALL from metier1 UNION 
    select id as IDALL, prenom as PRENOM from metier2 order by IDALL DESC");
     while($row = mysql_fetch_array($result)) {
     	echo "$row[0]<br>";
    }
     
  13. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Ca y est, je crois que j'ai réussi... Il fallait mettre un nombre de champs égal dans le select!...
     
  14. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 847
    J'aime reçus:
    217
    Ben oui, je me suis cassée à te donner la structure exacte que tu voulais :) (qui soit dit en passant ne correspond pas à ce que tu as fait)
     
  15. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Bon ben j'y arrive pas... Je demande pas le même nombre de champs dans les deux tables, j'ai aucun resultat...
    (j'ai pas mis tous les champs, il y en a une bonne quinzaine dans chaque table)...

    Code:
    $result = mysql_query("select id as IDALL, prenom as PRENOM, critere1 as CRITERE from metier1 UNION 
    select id as IDALL, prenom as PRENOM, critere2 as CRITERE from metier2 order by IDALL DESC");
     while($row = mysql_fetch_array($result)) {
        echo "$row[0] - $row[1] - $row[2]<br>";
    }
    
     
  16. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 847
    J'aime reçus:
    217
    là pourtant ça devrait marcher...
    essaye de mettre metier1.id as IDALL metier1.prenom as PRENOM, etc...
     
  17. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Même résultat... :-(
     
  18. SaintAmand
    SaintAmand WRInaute discret
    Inscrit:
    1 Mars 2011
    Messages:
    88
    J'aime reçus:
    1
    UNION récupère toutes les lignes et supprime les doublons (comprendre UNION DISTINCT). UNION est donc beaucoup plus gourmand en ressources qu'un simple UNION ALL qui
    conserve toutes les lignes. De manière imagée cela donne:

    {a,b,c} UNION {a,b,d} = {a,a,b,b,c,d}
    {a,b,c} UNION ALL {a,b,d} = {a,b,c,d}

    Si tes tables n'ont pas de lignes communes alors fait un UNION ALL, sinon ca dépendra de ce que tu veux obtenir.
     
  19. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Je veux obtenir toutes les lignes, il n'y a aucun rapport entre les deux bases et si il y a des doublons, il faut que je les affichent également...
     
  20. SaintAmand
    SaintAmand WRInaute discret
    Inscrit:
    1 Mars 2011
    Messages:
    88
    J'aime reçus:
    1
    Alors c'est UNION ALL.
     
  21. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Apparemment j'ai trouvé u truc : il refuse de me donner des résultat si le nombre de colonnes demandées n'est pas identique dans les deux select... Mais j'i une table qui a deux fois plus de colonnes que l'autre... Comment faire?...
     
  22. SaintAmand
    SaintAmand WRInaute discret
    Inscrit:
    1 Mars 2011
    Messages:
    88
    J'aime reçus:
    1
    Ah oui, http://dev.mysql.com/doc/refman/5.0/fr/union.html

    Pour résoudre le problème il te suffit de rajouter les colonnes qui manquent. Par exemple quelque chose comme

    Code:
    SELECT col1, col2, NULL, 0
    FROM table1
    UNION ALL
    SELECT col1, col2, col3, col4
    FROM table2
    J'ai complété la table1 avec deux colonnes contenant respectivement la valeur NULL et l'entier 0.
     
  23. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Ok, merci.
    Je rencontre un autre problème : même en suivant le nombre de colonne (j'ajoute à chaque fois une colonne supplémentaire et je test), arrivé à un moment, il ne me trie plus l'ensemble mais me place les enregistrements de la table 1 pui ceux de la table 2 à la fin... Plus de tri sur la date... Je comprends plus rien!...

    Cette requete ne fonctionne pas :
    Code:
    $result = $db->sql_query("select id as ID, uid_pro as UIDPRO, taux as TAUX, nombre as NOMBRE, date as DATEALL from table1 UNION ALL
    select id as ID, uid_pro as UIDPRO, taux as TAUX, produit as PRODUIT, date as DATEALL from table2 order by DATEALL DESC");
     while($row = $db->sql_fetchrow($result)) {
     	echo "$row[ID] - $row[UIDPRO] - $row[TAUX] - $row[DATEALL] - $row[VALACHAT] - $row[PRODUIT]<br>";
    }
    Celle ci marche :

    Code:
    $result = $db->sql_query("select id as ID, uid_pro as UIDPRO, taux as TAUX, date as DATEALL from table1 UNION ALL
    select id as ID, uid_pro as UIDPRO, produit as PRODUIT, date as DATEALL from table2 order by DATEALL DESC");
     while($row = $db->sql_fetchrow($result)) {
     	echo "$row[ID] - $row[UIDPRO] - $row[TAUX] - $row[DATEALL] - $row[VALACHAT] - $row[PRODUIT]<br>";
    }
    
     
  24. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Ouahou... Je crois que j'ai réussi à m'en dépatouiller... :-o Je vais encore regarder si je ne trouve pas d'anomalies avant de crier victoire...
     
  25. SaintAmand
    SaintAmand WRInaute discret
    Inscrit:
    1 Mars 2011
    Messages:
    88
    J'aime reçus:
    1
    Euh, tu mets au point tes requêtes en utilisant le code ci-dessus ? Tu sais que c'est plus sympa avec PhpMyAdmin ?
     
  26. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Ben moi je préfère via php... ;)
     
  27. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Ok, merci, ça fonctionne! :)

    J'ai juste un souci de tri. Le tri par DATEALL fonctionne :

    Code:
    select date as DATEALL, id , uid_pro, taux as TAUXALL, nombre, nombre2, validite1, validite2, commentaire, val1, val2, val3, val4, val5, val6 from table1 UNION ALL
    select date as DATEALL, id, uid_pro, produit, valeur_achat, taux as TAUXALL, validite1, validite2, NULL, NULL, NULL, NULL, NULL, NULL, NULL from table2 order by DATEALL DESC 
    Par contre le tri par TAUXALL ne fonctionne pas... :(

    Code:
    select date as DATEALL, id , uid_pro, taux as TAUXALL, nombre, nombre2, validite1, validite2, commentaire, val1, val2, val3, val4, val5, val6 from table1 UNION ALL
    select date as DATEALL, id, uid_pro, produit, valeur_achat, taux as TAUXALL, validite1, validite2, NULL, NULL, NULL, NULL, NULL, NULL, NULL from table2 order by TAUXALL DESC 
    Je comprends pas , c'est la même syntaxe pourtant... Est ce que le tri ne peut s'opérer qu'avec le premier élément?...
     
  28. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 847
    J'aime reçus:
    217
    Tu as un décalage de colonnes sur la deuxième partie de ta requête, tu as oublié de rajouter les Null correspondant à produit et valeur_achat dans la première sélection
     
  29. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    Ben je ne peux pas, j'ai besoin de ces valeurs... Si je mets NULL à la place, je ne peux pas les récupérer...
     
  30. Marie-Aude
    Marie-Aude WRInaute accro
    Inscrit:
    5 Juin 2006
    Messages:
    16 847
    J'aime reçus:
    217
    Euh pas à la place
    R1 -> R2
    date -> date (col1)
    id -> id (col2)
    uid_pro ->uid_pro (col3)
    taux -> produit (col4) donc là tu fais NULL dans la requete 1
    pareil pour valeur_achat il faut un Null dans la requete 1
    à ce moment là taux sera dans la colonne 6 dans les deux requetes et ça marchera mieux
     
  31. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    848
    J'aime reçus:
    0
    ah ok, j'avais pas compris ce fonctionnement. En effet, ça marche maintenant! Merci pour tout! :)
     
Chargement...
Similar Threads - Mysql select tables Forum Date
[MySQL] Requête SELECT et INSERT entre 3 tables liées+Aide Développement d'un site Web ou d'une appli mobile 30 Avril 2014
[MySQL] Requête SELECT entre 3 tables liées Développement d'un site Web ou d'une appli mobile 10 Août 2011
[PHP/SQL] Associer plusieurs SELECT de tables MySQL Développement d'un site Web ou d'une appli mobile 27 Novembre 2010
[MySQL] : select de 2 tables et mysql_fetch_assoc Développement d'un site Web ou d'une appli mobile 22 Septembre 2009
Mysql sélection aléatoire d'une colonne Développement d'un site Web ou d'une appli mobile 18 Novembre 2016
[MySQL] Liste (select) avec des lignes au hasard Développement d'un site Web ou d'une appli mobile 23 Octobre 2014
[MySQL] sélectionner la dernière note pour chaque élève en une seule requète ? Développement d'un site Web ou d'une appli mobile 12 Avril 2012
Mysql : select d'une valeur dans un champs en contenant plusieurs Développement d'un site Web ou d'une appli mobile 27 Janvier 2010
[mysql+php] Insert....select et modifications au passage Développement d'un site Web ou d'une appli mobile 18 Août 2009
[résolu][MySQL] Sélection groupée et comptage Développement d'un site Web ou d'une appli mobile 22 Septembre 2008
MySql selection sans doublon (select distinct) Développement d'un site Web ou d'une appli mobile 18 Septembre 2008
MySQL : SELECT spécial avec GROUP BY sur condition ? Développement d'un site Web ou d'une appli mobile 13 Mai 2008
Update / Select et Mysql Développement d'un site Web ou d'une appli mobile 28 Février 2008
[Résolu] Mysql : Select avec un except Développement d'un site Web ou d'une appli mobile 11 Janvier 2008
Select where MYSQL Développement d'un site Web ou d'une appli mobile 4 Avril 2007
Petit calcul sous MySql / Select Développement d'un site Web ou d'une appli mobile 6 Mars 2007
[Résolu] Update / Select LEFT JOIN / et mysql Développement d'un site Web ou d'une appli mobile 31 Mai 2006
mysql & subselect Administration d'un site Web 1 Février 2005
fONCTION select mysql Administration d'un site Web 5 Juillet 2004
Mysql : Impact convertion champ numérique SMALLINT vers BIGINT Développement d'un site Web ou d'une appli mobile 23 Août 2021