Page 1 sur 2

2 requetes en une seule

Posté : 24 mars 2011, 08:39
par rimie1
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

Re: 2 requetes en une seule

Posté : 24 mars 2011, 09:03
par xTG
Cela s'appelle les jointures ce que tu demandes. ;)
Renseignes toi sur le mot clé JOIN.

Re: 2 requetes en une seule

Posté : 24 mars 2011, 14:35
par rimie1
j'ai trouve ce tuto et je ne sais pas laquelle correspond a mon exemple, je suis debutante en SQL

Re: 2 requetes en une seule

Posté : 25 mars 2011, 15:38
par dunbar
Salut,

Essaye comme ceci ??
SELECT albums.id, chanson.* FROM chanson, albums  WHERE chanson.ida = albums.id AND albums.id= x

Re: 2 requetes en une seule

Posté : 30 mars 2011, 10:53
par rimie1
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)

Re: 2 requetes en une seule

Posté : 30 mars 2011, 16:20
par dunbar
Salut,

Logique tu ne lui donne pas un numéro spécifique d'albums

Re: 2 requetes en une seule

Posté : 31 mars 2011, 03:42
par rimie1
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

Re: 2 requetes en une seule

Posté : 31 mars 2011, 08:06
par xTG
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.

Re: 2 requetes en une seule

Posté : 31 mars 2011, 15:27
par dunbar
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

Re: 2 requetes en une seule

Posté : 01 avr. 2011, 07:55
par rimie1
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

Re: 2 requetes en une seule

Posté : 01 avr. 2011, 08:34
par xTG
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.

Re: 2 requetes en une seule

Posté : 01 avr. 2011, 09:39
par sadeq
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

Re: 2 requetes en une seule

Posté : 01 avr. 2011, 12:13
par dunbar
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

Re: 2 requetes en une seule

Posté : 03 avr. 2011, 03:27
par rimie1
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?

Re: 2 requetes en une seule

Posté : 03 avr. 2011, 14:39
par sadeq
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".