Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/09/2007, 15h21   #1
Invité de passage
 
Inscription : septembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 5
Points : 1
Points : 1
Par défaut [SQL] Liste sans doublons

Bonjour,
Voila, j'ai une table films avec entre autres:
un champ acteur qui peut contenir parfois 1,2 ou 3 noms d'acteur,par id, séparés par une virgule, Certains noms d'acteurs se retrouvent sur différentes id (film)
je voudrais faire une requete qui me renvoie une liste de tous les acteurs, classée par ordre alphabetique , sans doublons et sans erreur si le film ne mentionne qu'un acteur..
Pour le problème de la virgule, je l'ai résolu en php avec explode, pour les doublons, je ne vois pas comment faire, si quelqu'un peut m'aider, je suis débutante en php, je sais qu'il existe une fonction array_unique, mais, je ne vois pas comment m'en servir.Peut etre y a t-il un moyen dans la requete sql?
Merci
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
 
                        require("include/connexion.inc.php");                                   
                        $reponse = mysql_query("SELECT DISTINCT acteur_film FROM films ORDER BY acteur_film");                          
                        while ($donnees = mysql_fetch_array($reponse) )
                        {                                                                       
                        $acteur = $donnees['acteur_film'];
                        $acteur_explosee = explode(",", $acteur);
 
                        echo ''.$acteur_explosee[0].'<br/>';
                        echo ''.$acteur_explosee[1].'<br/>';
                        echo ''.$acteur_explosee[2].'<br/>';
                        }
 
?>
tchin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 15h27   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Le mieux ca serait d'avoir une table avec une liste des acteurs quand meme.
Mais tu peux faire quelquechose comme ca

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
require("include/connexion.inc.php");    
// récupère la liste des tous les acteurs de tous les films                               
$reponse = mysql_query("SELECT acteur_film FROM films");     
 
// Crée un tableau qui va contenir tous les acteurs
$acteurs = array();
 
while ($donnees = mysql_fetch_array($reponse) )
{                                                                       
$acteur = $donnees['acteur_film'];
$acteur_explosee = explode(",", $acteur);
 
// pour chaque acteur de ce film
foreach($acteur_explosee as $nom_acteur)
{
// ajoute dans la liste
$acteurs[] = $nom_acteur;
}
}
 
// Enlève les doublons
$acteursUniques = array_unique($acteurs);
 
// Trie le tableau
$acteursTries = sort($acteursUniques);
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 09h36   #3
Invité de passage
 
Inscription : septembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 5
Points : 1
Points : 1
Par défaut Liste sans doublons

Merci pour m'avoir répondu si vite.
Je pense comprendre le principe, mais j'ai du faire une erreur car j'obtiens:
Fatal error: [] operator not supported for strings on line 18.
J'ai rajouté un s à $auteur

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
require("include/connexion.inc.php");    
// récupère la liste des tous les acteurs de tous les films                               
$reponse = mysql_query("SELECT acteur_film FROM films");     
 
// Crée un tableau qui va contenir tous les acteurs
$acteurs = array();
 
while ($donnees = mysql_fetch_array($reponse) )
{                                                                       
$acteurs = $donnees['acteur_film'];
$acteur_explosee = explode(",", $acteurs);
 
// pour chaque acteur de ce film
foreach($acteur_explosee as $nom_acteur)
{
// ajoute dans la liste
$acteurs[] = $nom_acteur;
// Enlève les doublons
$acteursUniques = array_unique($acteurs);
		echo ''.$acteursUniques.'<br/>';
 
}
}
?>
tchin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 09h38   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
tu définis $acteurs comme étant un array() mais juste apres tu lui mets une string dedans donc forcément ca rale...
Remplaces
Code :
1
2
$acteurs = $donnees['acteur_film'];
$acteur_explosee = explode(",", $acteurs);
par
Code :
1
2
 
$acteur_explosee = explode(",", $donnees['acteur_film']);
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 10h17   #5
Invité de passage
 
Inscription : septembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 5
Points : 1
Points : 1
Effectivement,ça pouvait pas marcher.
J'ai repris le code que tu m'as donné en premier, mais j'obtiens une liste de array.
Je vois pas ou ça cloche?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
require("include/connexion.inc.php");    
// récupère la liste des tous les acteurs de tous les films                               
$reponse = mysql_query("SELECT acteur_film FROM films");     
 
// Crée un tableau qui va contenir tous les acteurs
$acteurs = array();
 
while ($donnees = mysql_fetch_array($reponse) )
{                                                                       
$acteur = $donnees['acteur_film'];
$acteur_explosee = explode(",", $acteur);
 
// pour chaque acteur de ce film
foreach($acteur_explosee as $nom_acteur)
{
// ajoute dans la liste
$acteurs[] = $nom_acteur;
// Enlève les doublons
$acteursUniques = array_unique($acteurs);
echo ''.$acteursUniques.'<br/>';
}
 
}
?>
tchin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 10h53   #6
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Si tu regardes bien mon code d'origine, mon array_unique et le echo sont en dehors du foreach, il faut d'abord récupérer TOUS les acteurs, et ensuite tu tries et tu affiches
Pourquoi tu ne prends pas directement mon code?
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 11h51   #7
Invité de passage
 
Inscription : septembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 5
Points : 1
Points : 1
Par défaut Liste sans doublons

J'ai bien sûr essayé ton code, en rajoutant l'affichage en dehors de foreach,
mais cela m'affiche une liste d'array.
Voila ton code avec ma ligne d'affichage:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
require("include/connexion.inc.php");    
// récupère la liste des tous les acteurs de tous les films                               
$reponse = mysql_query("SELECT acteur_film FROM films");     
 
// Crée un tableau qui va contenir tous les acteurs
$acteurs = array();
 
while ($donnees = mysql_fetch_array($reponse) )
{                                                                       
$acteur = $donnees['acteur_film'];
$acteur_explosee = explode(",", $acteur);
 
// pour chaque acteur de ce film
foreach($acteur_explosee as $nom_acteur)
{
// ajoute dans la liste
$acteurs[] = $nom_acteur;
}
}
 
// Enlève les doublons
$acteursUniques = array_unique($acteurs);
 
// Trie le tableau
$acteursTries = sort($acteursUniques);
 echo ''.$acteursUniques.'<br/>';
 
 ?>
tchin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 12h58   #8
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
echo ne permet pas d'afficher un tableau directement.
Il faut faire ca a la fin :
Code :
1
2
3
4
 foreach($acteursUniques as $monacteur)
{
echo $monacteur . '<br/>';
}
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 13h43   #9
Invité de passage
 
Inscription : septembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 5
Points : 1
Points : 1
Par défaut Liste sans doublons

Merci koopajah pour ta patience.
C'est super,ça marche nickel.
Je vais potasser foreach
tchin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h47.


 
 
 
 
Partenaires

Hébergement Web