2 requetes en une seule

rimie1
Invité n'ayant pas de compte PHPfrance

24 mars 2011, 08:39

bonjour!

j'utilise 2 requetes afin d'avoir un resultat, la premiere ne m'aide que pour definir le premier resultat que je vais l'utiliser dans la 2eme requete pour avoir le resultat finale, exemple:
table albums
id
nom_album
table chansons
id
ida // id de l'album
chanson
SELECT id FROM albums;

while()
extract rows;

// je voudrais afficher les chanson de l'album x
SELECT * FROM chanson WHERE ida = id
Est ce qu'il y a une methode afin de rassembler les 2requetes en une seule.

merci

ViPHP
xTG
ViPHP | 7331 Messages

24 mars 2011, 09:03

Cela s'appelle les jointures ce que tu demandes. ;)
Renseignes toi sur le mot clé JOIN.

rimie1
Invité n'ayant pas de compte PHPfrance

24 mars 2011, 14:35

j'ai trouve ce tuto et je ne sais pas laquelle correspond a mon exemple, je suis debutante en SQL

ViPHP
ViPHP | 2291 Messages

25 mars 2011, 15:38

Salut,

Essaye comme ceci ??
SELECT albums.id, chanson.* FROM chanson, albums  WHERE chanson.ida = albums.id AND albums.id= x
Modifié en dernier par dunbar le 01 avr. 2011, 12:15, modifié 1 fois.
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

rimie1
Invité n'ayant pas de compte PHPfrance

30 mars 2011, 10:53

voila les 2 tables ainsi que la requete, il me donne toutes les donnees dans la table chansons:
CREATE TABLE IF NOT EXISTS `albums` (
  `ida` int(2) NOT NULL auto_increment,
  `noma` varchar(200) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`ida`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

--
-- Dumping data for table `albums`
--

INSERT INTO `albums` (`ida`, `noma`) VALUES
(1, 'album1'),
(2, 'album2');

CREATE TABLE IF NOT EXISTS `chansons` (
  `idc` int(2) NOT NULL auto_increment,
  `ida1` int(2) NOT NULL,
  `nomc` varchar(200) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`idc`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;

--
-- Dumping data for table `chansons`
--

INSERT INTO `chansons` (`idc`, `ida1`, `nomc`) VALUES
(1, 1, 'chanson1'),
(2, 1, 'chanson2'),
(3, 1, 'chanson3'),
(4, 2, 'chanson4');
et la requete:
SELECT albums.ida, chansons.* FROM chansons, albums WHERE chansons.ida1 = albums.ida
resultat, toutes les lignes de chansons:

Showing rows 0 - 3 (4 total, Query took 0.0008 sec)

ViPHP
ViPHP | 2291 Messages

30 mars 2011, 16:20

Salut,

Logique tu ne lui donne pas un numéro spécifique d'albums
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

rimie1
Invité n'ayant pas de compte PHPfrance

31 mars 2011, 03:42

Salut,

Logique tu ne lui donne pas un numéro spécifique d'albums
Sur phpmyadmin j'ai mis un chiffre au lieu de ida et ida1 mais il ne l'accepte pas

ViPHP
xTG
ViPHP | 7331 Messages

31 mars 2011, 08:06

C'est la jointure que tu as touché, c'est mal ! :P
Il faut rajouter une condition avec un ET pour spécifier l'id.

ViPHP
ViPHP | 2291 Messages

31 mars 2011, 15:27

Salut,

Logique tu ne lui donne pas un numéro spécifique d'albums
Sur phpmyadmin j'ai mis un chiffre au lieu de ida et ida1 mais il ne l'accepte pas
a tu essayer comme ceci = '1' et pas = 1
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

rimie1
Invité n'ayant pas de compte PHPfrance

01 avr. 2011, 07:55

J'ai essaye comme ca:
SELECT albums.ida, chansons . * FROM chansons, albums WHERE chansons.ida1 = '1'
ca me donne:

Code : Tout sélectionner

chanson1 chanson1 chanson2 chanson2 chanson3 chanson3

ViPHP
xTG
ViPHP | 7331 Messages

01 avr. 2011, 08:34

Faut pas enlever la jointure... Je pensais avoir été clair.
SELECT albums.ida, chansons . * FROM chansons, albums WHERE chansons.ida1 = albums.ida AND chansons.ida1 = 1
Et pas de quote autour du 1 car ida1 est de type entier dans ta table.

D'ailleurs je ne m'explique même pas comment tu as pu avoir un résultat sur ta dernière requête... Il aurait du te renvoyer une belle erreur en indiquant qu'il ne pouvait choisir le albums.ida sans plus de précision.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

01 avr. 2011, 09:39

Bonjour,

Effectivement, les jointures entre les tables d'une base de données sont importantes quand les tables sont en relation, et il est obligatoire de les rappeler dans les requêtes SQL. Je rappelle qu'une jointure est l'association entre une clé primaire d'une première table et une clé étrangère se trouvant dans une deuxième table et qui est le "sosie" typique de la clé primaire.

La jointure naturelle (égalité entre clé primaire et étrangère) permet à elle seule de sélectionner les enregistrements qui forment l'intersection entre la table de la clé primaire et celle de la clé étrangère. Voici un exemple partant de ton schéma de base de données:
Image
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
ViPHP | 2291 Messages

01 avr. 2011, 12:13

Faut pas enlever la jointure... Je pensais avoir été clair.
SELECT albums.ida, chansons . * FROM chansons, albums WHERE chansons.ida1 = albums.ida AND chansons.ida1 = 1
Et pas de quote autour du 1 car ida1 est de type entier dans ta table.
Autant pour :oops: moi
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

rimie1
Invité n'ayant pas de compte PHPfrance

03 avr. 2011, 03:27

bonjour,
ca marche bien merci, et pourquoi on a ajoute AND chansons.ida1 = 1
SELECT albums.ida, chansons . * FROM chansons, albums WHERE chansons.ida1 = albums.ida AND chansons.ida1 = 1
sadeq: j'ai compris votre exemple, mais pour la requete ci-dessus, il y a une complixite a partir de ".* FROM", pourquoi le point?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 avr. 2011, 14:39

bonjour,
ca marche bien merci, et pourquoi on a ajoute AND chansons.ida1 = 1
SELECT albums.ida, chansons . * FROM chansons, albums WHERE chansons.ida1 = albums.ida AND chansons.ida1 = 1
sadeq: j'ai compris votre exemple, mais pour la requete ci-dessus, il y a une complixite a partir de ".* FROM", pourquoi le point?
Bonjour,

Pour la question "Pourquoi AND chansons.ida1 = 1?" : C'est pour ne sélectionner que les chansons de l'album n°1 (celles que j'ai coloré en jaune) car la jointure retourne tous les ensembles de chansons ayant des albums ( c'est à dire toutes les chansons dans ton cas)

Pour la question sur "Pourquoi chansons.* dans la requête ? " : C'est pour dire que tu veux sélectionner tous les champs de la table "Chansons".
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène