Champs de plusieurs donnees du meme type

Mammouth du PHP | 725 Messages

12 janv. 2012, 09:47

Bonjour,

J'ai 3 tables (albums, chansons et chanteurs):
CREATE TABLE albums
id
album

CREATE TABLE chansons
id
idalbum
chanson

CREATE TABLE chanteurs
id
idchanson
chanteur
une seule chanson peut etre chantee par plusieurs chanteurs, resultat souhaite:

Code : Tout sélectionner

chanson1: chanteur1, chanteur3, chanteur8 chanson2: chanteur2, chanteur3, chanteur10, chanteur20 chanson3: chanteur1, chanteur13, chanteur18
que dois je faire exactement pour avoir ce resultat?

est ce qu'il y a un type de champs que l'on peut mettre:
CREATE TABLE chansons
id
idalbum
idchanteurs => les enumerer (chanteur1, chanteur2, chanteur3, chanteur4)
chanson
merci

Eléphant du PHP | 209 Messages

12 janv. 2012, 10:29

Salut,

Il faut que tu fasses une table de jointures entre les deux qui va contenir tes id chansons et chanteurs.

Cela te permettra de connaître :
- les chansons chantées par un chanteur
- les chanteurs qui ont chanté une chanson

Éventuellement, le même procédé peut être utilisé entre album et chanson car la même chanson peut exister sur plusieurs albums ;)

Mammouth du PHP | 725 Messages

12 janv. 2012, 11:06

quelque chose comme:
CREATE TABLE joinTables
id
idchanson
idchanteur

INSERT INTO joinTables VALUES ('', 1, 1);
,('', 1, 3);
,('', 1, 8);

La chanson 1 a ete chante par chanteur1, chanteur3 et chanteur8

Eléphant du PHP | 209 Messages

12 janv. 2012, 11:14

Voila sauf que pour le coup, tu n'as pas besoin de ta colonne id sur cette nouvelle table.
Ta clé primaire se constitue du couple de tes deux champs idchanson et idchanteur ;)

ViPHP
ViPHP | 2577 Messages

12 janv. 2012, 12:52

Il y a une ambiguïté, entre une chanson=titre et une chanson=enregistrement sonore.

Mammouth du PHP | 725 Messages

12 janv. 2012, 14:18

Voila sauf que pour le coup, tu n'as pas besoin de ta colonne id sur cette nouvelle table.
Ta clé primaire se constitue du couple de tes deux champs idchanson et idchanteur ;)
J'ai fait cette requete:
$sqlsh = 'SELECT * FROM chansonjoin, chanteurs, chansons WHERE chansonjoin.id = chanteurs.id_ch AND chansonjoin.id = chansons.id_c';
        
        
echo $sqlsh;
$reqsh = $connexion->query($sqlsh);
$resultsh = $reqsh->fetchAll();
		
		$chanteur_list = '';
		foreach($resultsh as $shK=>$shV)
		{
			$chanteur = $shV['chanteur'];
			
			$chanteur_list .= $chanteur;
		}
        echo $chanteur_list;


Mais puisque cette requete se trouve au sein d'une autre requete:
foreach()

{
	//ma requete sqlsh
	
}

ca me donne un resultat:
chanson1: chanteur1, chanteur4, chanteur8

de meme chanson2

chanson2: chanteur1, chanteur4, chanteur8


@Mazarini: titre :)

Mammouth du PHP | 725 Messages

17 janv. 2012, 06:40

est ce que vous avez une idee sur ce probleme?

Eléphant du PHP | 209 Messages

17 janv. 2012, 10:36

Il faudrait que tu me passes ton modèle mis à jour.. Qu'est-ce que chansonjoin ?

Mammouth du PHP | 725 Messages

18 janv. 2012, 05:10

Il faudrait que tu me passes ton modèle mis à jour.. Qu'est-ce que chansonjoin ?
c'est la table de jointure des 2 tables (chanteurs, chansons), qui a comme champs les id des 2 tables

Eléphant du PHP | 209 Messages

18 janv. 2012, 10:18

Plutôt quelque chose comme ça alors :
SELECT * FROM chansonjoin, chanteurs, chansons WHERE chansonjoin.idchanteur = chanteurs.id AND chansonjoin.idchanson = chansons.id;

Mammouth du PHP | 725 Messages

20 janv. 2012, 05:27

non ca marche pas, ca donne des resultats confondus

Mammouth du PHP | 725 Messages

20 janv. 2012, 05:43

ce qui me bloque c'est le suivant:
// je fais une requete pour recuperere les chansons
SELECT............
$resultChansons = '........';


// je fais une requete pour recupererer les chanteurs, suivant la methode ci-dessus
SELECT............
$resultChanteurs = '........';

foreach($resultChanteurs ...)
{

}


// ici je fais l'affichage des chansons:

foreach($resultChansons ...)
{


}

si je prend le foreach($resultChanteur...) et je la mets au sein de foreach($resultChansons ...) ca me donne:

chanson1: liste des chanteurs.....
chanson1: liste des chanteurs.....
chanson1: liste des chanteurs.....
...

chanson2: liste des chanteurs.....
chanson2: liste des chanteurs.....
chanson2: liste des chanteurs.....
...

ca melange les resultats parce que j'ai fait un double foreach, une au sein de l'autre

et si je le fais separement, ca me donne:

chanson1: dernier chanteur
chanson2: dernier chanteur

il prend juste le dernier chanteur