Rassembler plusieurs lignes sql en php [Résolu/Fermé]

Signaler
-
 Mireilla -
Bonjour toute la communauté,

Je voulais savoir, si quelqu'un serait comment on peut rassembler plusieurs lignes qui sont identiques.

En effet, quand je fais un SELECT*FROM avec mes tables(3tables) et mes colonnes que je veux j'arrive à tout ressortir avec les 3 colonnes que je veux, comme Prenom, Pays et Commentaire.

Donc les résultats s'affiche de cette manière :

Prenom : Machin
Pays: Italie
Commentaire: aujourd'hui

Prenom : Machin
Pays: Italie
Commentaire: 18/07/17

Prenom : Machin
Pays: Italie
Commentaire: il fait beau

Prenom : Truc
Pays: France
Commentaire: aujourd'hui

Prenom : Truc
Pays: France
Commentaire: 17/07/17

Prenom : Truc
Pays: France
Commentaire: il fait beau


En fonction de ces tables :

Table commentaire:

ID Numéro Type Commentaire

1 6 36 aujourd'hui
1 6 36 18/07/2017
1 6 36 il fait beau

2 7 3 aujourd'hui
2 7 3 17/07/2017
2 7 3 il fait beau


Table pays:

ID_pays pays ville ID

1 Italie Rome 1
2 France Paris 2


<gras>Table client gras>

ID_nom NOM Prenom ID

1 Truc Machin 1
2 Machin Truc 2



Merci :)

2 réponses

Messages postés
10205
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 mars 2020
576
bonsoir,
Si je comprends bien, tu nous montres ce que tu obtiens comme réponse.
Pourrais-tu nous montrer également:
- la source SQL de ta requête
- ce que tu souhaites obtenir comme réponse
Bonjour,

Désolé hier j'ai eu un soucis informatique, impossible de me connecter bref,
en effet il manque une partie dans mon énoncé.

J'avais mit également ce que je voulais mais je viens de voir que ca n'a pas fonctionné.

Je voudrais que la réponse soit écrite de cette façon :

Prenom : Machin
Pays: Italie
Commentaire: aujourd'hui 18/07/17 il fait beau


Prenom : Tuc
Pays: Italie
Commentaire: aujourd'hui 17/07/17 il fait beau


Ma requête est écrite de cette façon :

$maRequete = ("SELECT * FROM dbo.[commentaire] LEFT OUTER JOIN dbo.[pays] ON dbo.[commentaire].ID = dbo.[pays].ID
LEFT OUTER JOIN dbo.[client] ON dbo.[client].ID= dbo.[commentaire].ID WHERE $where");


Ici, $where corresponds a ma recherche de mot clé.

Cordialement.
Messages postés
3603
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
26 mars 2020
943
Bonjour,

Tu as deux solutions.

Soit concaténer au niveau SQL la colonne commentaire en faisant un GROUP BY ID, Numéro. La syntaxe va dépendre de ton SGBD. Malheureusement, il me semble que tu es sous SQL Server... Dans une version (très) récente, tu peux utiliser STRING_AGG. Sinon c'est beaucoup plus complexe. Avec STRING_AGG :
SELECT cl.Prenom, p.Pays, co.ID, STRING_AGG(co.commentaire, ' ') as commentaire
FROM  dbo.[commentaire] co
LEFT OUTER JOIN dbo.[pays] p ON co.ID = p.ID
LEFT OUTER JOIN dbo.[client] cl ON cl.ID= co.ID
WHERE $where
GROUP BY cl.Prenom, p.Pays, co.ID


C'est la solution la plus propre à mon goût, mais si tu n'as pas STRING_AGG, le mieux est de trier les résultats par co.ID, puis, au niveau du php, de réaliser la concaténation en n'affichant le résultat qu'à chaque changement d'ID.
Pour ça ta requête SQL devient :
SELECT * FROM dbo.[commentaire]
LEFT OUTER JOIN dbo.[pays] ON dbo.[commentaire].ID = dbo.[pays].ID
LEFT OUTER JOIN dbo.[client] ON dbo.[client].ID= dbo.[commentaire].ID WHERE $where"
ORDER BY dbo.[commentaire].ID

Et dans ton php, au lieu de faire des "echo" à chaque ligne, tu gardes dans des variables les valeurs, y compris ID, et en début de boucle tu vérifies si l'ID en cours est le même que l'ID en mémoire ; si c'est le même, tu fais
$commentaire .= ' ' . $row['commentaire']
(à adapter à tes noms de variables), sinon tu fais tes echo.

Xavier

PS : Un point important : rien ne te garantit que les morceaux de phrases n'arrivent dans le bon ordre...
> yg_be
Messages postés
10205
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 mars 2020

Oui en effet j'avais une erreur sur ma requête toute bête mais que je n'avais pas vu et c'est vrais que je n'ai pas encore pris cette habitude de faire des debugges sur mes requêtes, je vais m'écrire un petit posthite pour y pensé et ne plus oublié de faire ca :)

Maintenant ca fonctionne :)
Reivax962
Messages postés
3603
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
26 mars 2020
943 > Mireilla
« Donc, lequel je prends pour faire mon false? Est-ce que je prendre un au hasard ? a partir du moment que c'est mon lien entre les tables? »
Il faut prendre un champ qui soit constant pour chaque morceau de commentaire. N'importe quel champ qui permette de dire : ce bout de commentaire va avec cet autre bout de commentaire.
Donc si je reprends l'extrait de table que tu as montré, ça semble pouvoir être ID ou Numero ou Type. Si les noms des colonnes ont du sens, c'est probablement Numéro le meilleur choix.
Et, important, il faut que ce soit le même champ dans le ORDER BY.

Xavier
yg_be
Messages postés
10205
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 mars 2020
576 > Reivax962
Messages postés
3603
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
26 mars 2020

si nécessaire, cela peut se faire avec une combinaison de plusieurs champs. le plus simple, dans ce cas-là, serait de les combiner dans la requête.
> Reivax962
Messages postés
3603
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
26 mars 2020

D'accord maintenant j'ai compris :)

Merci pour l'explication.
Merci pour ton aide !

Maintenant ça fonctionne et ça me regroupe bien la partie que je veux :)
Vraiment un super merci car je commençais a être en panique :)

Bonne journée à toi.