Jointure et "LIMIT"

Jointure et "LIMIT" - PHP - Programmation

Marsh Posté le 21-12-2005 à 12:54:48    

J'ai une requête mysql avec jointure sur 3 tables :
La table DVD et la table Acteurs et la table de relaction entre les DVD et les acteurs.
Un DVD peu biensur avoir plusieur acteurs...
Quand je met un LIMIT pour avoir seulement les 10 premiers résultats il me retourne :
 
...Comme elle respire > Marie Trintignant
...Comme elle respire > Guillaume Depardieu
...Comme elle respire > Jean-françois Stévenin
...Comme elle respire > Serge Riaboukine
...Comme elle respire > Blanchette Brunoy
...Comme elle respire > Michèle Moretti
1 Chance sur 2 > Jean-paul Belmondo
1 Chance sur 2 > Alain Delon
1 Chance sur 2 > Vanessa Paradis
1 Chance sur 2 > Eric Defosse
 
Hors moi je veux les 10 premier films et non pas les 10 premières paires !
 
Voici ma requête :
 

Code :
  1. $result = mysql_query("
  2. SELECT dvd_catalogue.titre,dvd_catalogue.id_dvd,dvd_lib_acteurs.id_acteur,dvd_lib_acteurs.acteur
  3. FROM dvd_catalogue
  4. INNER JOIN dvd_join_acteurs ON (dvd_catalogue.id_dvd=dvd_join_acteurs.id_dvd)
  5. INNER JOIN dvd_lib_acteurs ON (dvd_join_acteurs.id_acteur=dvd_lib_acteurs.id_acteur)
  6. ORDER BY dvd_catalogue.titre
  7. LIMIT 10
  8. " );


 
Comment faire?

Message cité 2 fois
Message édité par will75012 le 21-12-2005 à 12:56:16
Reply

Marsh Posté le 21-12-2005 à 12:54:48   

Reply

Marsh Posté le 21-12-2005 à 13:57:47    

will75012 a écrit :

J'ai une requête mysql avec jointure sur 3 tables :
La table DVD et la table Acteurs et la table de relaction entre les DVD et les acteurs.
Un DVD peu biensur avoir plusieur acteurs...
Quand je met un LIMIT pour avoir seulement les 10 premiers résultats il me retourne :
 
...Comme elle respire > Marie Trintignant
...Comme elle respire > Guillaume Depardieu
...Comme elle respire > Jean-françois Stévenin
...Comme elle respire > Serge Riaboukine
...Comme elle respire > Blanchette Brunoy
...Comme elle respire > Michèle Moretti
1 Chance sur 2 > Jean-paul Belmondo
1 Chance sur 2 > Alain Delon
1 Chance sur 2 > Vanessa Paradis
1 Chance sur 2 > Eric Defosse
 
Hors moi je veux les 10 premier films et non pas les 10 premières paires !
 
Voici ma requête :
 

Code :
  1. $result = mysql_query("
  2. SELECT dvd_catalogue.titre,dvd_catalogue.id_dvd,dvd_lib_acteurs.id_acteur,dvd_lib_acteurs.acteur
  3. FROM dvd_catalogue
  4. INNER JOIN dvd_join_acteurs ON (dvd_catalogue.id_dvd=dvd_join_acteurs.id_dvd)
  5. INNER JOIN dvd_lib_acteurs ON (dvd_join_acteurs.id_acteur=dvd_lib_acteurs.id_acteur)
  6. ORDER BY dvd_catalogue.titre
  7. LIMIT 10
  8. " );


 
Comment faire?


 
C'est que ta jointure n'est pas bonne , là il te fait un produit cartesien (ortho).
Retire ton limit tu verras que logiquement il t'envera la même chose mais avec plus de resultat. Le probleme se trouve au niveau de ta jointe.

Reply

Marsh Posté le 21-12-2005 à 14:38:26    

Je sais que si j'enlève mon LIMIT il me retourne plus de résultats hors moi je veux 10 DVD comment faire? Si il y avait toujour 5 acteurs par DVD pas de problème je met le LIMIT à 50 et il me donne donc 10 DVD différents mais là se n'est pas possible comme des fois il y a qu'un acteurs (ou même pas dutout) et d'autre fois y en a une dizaine !

Reply

Marsh Posté le 21-12-2005 à 14:43:03    

Voila à quoi ressemble mes tables :
 

Code :
  1. CREATE TABLE dvd_catalogue (
  2.   id_dvd int(9) NOT NULL auto_increment,
  3.   titre varchar(255) NOT NULL default '',
  4.   vo varchar(255) NOT NULL default '',
  5.   synopsis text NOT NULL,
  6.   public int(1) NOT NULL default '0'
  7. ) TYPE=MyISAM;


 

Code :
  1. CREATE TABLE `dvd_lib_acteurs` (
  2.   `id_acteur` int(9) NOT NULL auto_increment,
  3.   `acteur` varchar(100) NOT NULL default ''
  4. ) TYPE=MyISAM;


 

Code :
  1. CREATE TABLE dvd_join_acteurs (
  2.   id_dvd int(9) NOT NULL default '0',
  3.   id_acteur int(9) NOT NULL default '0'
  4. ) TYPE=MyISAM;


 

Reply

Marsh Posté le 21-12-2005 à 15:36:51    

Quelle version de MySQL ?
 
Essaie en remplacant "FROM dvd_catalogue" par :
FROM (SELECT * FROM dvd_catalogue ORDER BY titre LIMIT 10) AS dvd_catalogue
 
Il faudra peut être utiliser un autre nom pour renommer.

Reply

Marsh Posté le 21-12-2005 à 15:43:42    

will75012 a écrit :

J'ai une requête mysql avec jointure sur 3 tables :
La table DVD et la table Acteurs et la table de relaction entre les DVD et les acteurs.
Un DVD peu biensur avoir plusieur acteurs...
Quand je met un LIMIT pour avoir seulement les 10 premiers résultats il me retourne :
 
...Comme elle respire > Marie Trintignant
...Comme elle respire > Guillaume Depardieu
...Comme elle respire > Jean-françois Stévenin
...Comme elle respire > Serge Riaboukine
...Comme elle respire > Blanchette Brunoy
...Comme elle respire > Michèle Moretti
1 Chance sur 2 > Jean-paul Belmondo
1 Chance sur 2 > Alain Delon
1 Chance sur 2 > Vanessa Paradis
1 Chance sur 2 > Eric Defosse
 
Hors moi je veux les 10 premier films et non pas les 10 premières paires !
 
 
Comment faire?


 
C'est normal qu'il te retourne ce resultat. Il retourne pour chaque film la liste des acteurs associée. Il contruit donc un ensemble de resultat et ne retourne que les 10 premieres paires.  
 
Pour avoir la liste des 10 premiers films, ca risque d'etre plus compliqué. Quelque chose du genre.
 

Code :
  1. SELECT dvd_catalogue.titre,dvd_catalogue.id_dvd,dvd_lib_acteurs.id_acteur,dvd_lib_acteurs.acteur
  2. FROM dvd_catalogue
  3. INNER JOIN dvd_join_acteurs ON (dvd_catalogue.id_dvd=dvd_join_acteurs.id_dvd)
  4. INNER JOIN dvd_lib_acteurs ON (dvd_join_acteurs.id_acteur=dvd_lib_acteurs.id_acteur)
  5. WHERE dvd_catalogue IN (SELECT dvd_catalogue.id_dvd FROM dvd_catalogue ORDER BY dvd_catalogue.titre LIMIT 10)
  6. ORDER BY dvd_catalogue.titre;


 
Là, la sous-requete definie la liste des id de films que tu veux prendre. Et le select retourne les acteurs.
 
Mais, certains diront que l'on peut le faire sans sous-requete.


---------------
MZP est de retour
Reply

Marsh Posté le 21-12-2005 à 15:44:45    

mrbebert a écrit :

Quelle version de MySQL ?
 
Essaie en remplacant "FROM dvd_catalogue" par :
FROM (SELECT * FROM dvd_catalogue ORDER BY titre LIMIT 10) AS dvd_catalogue
 
Il faudra peut être utiliser un autre nom pour renommer.


 
Tiens on peut faire ca avec MySql?


---------------
MZP est de retour
Reply

Marsh Posté le 21-12-2005 à 16:14:02    

A partir du 5 oui :jap: Quoi que il me semble qu'avec le 4. aussi  mais je me rappelle plus

Reply

Marsh Posté le 21-12-2005 à 17:11:24    

Avec une version 4.1.10, ce genre de chose fonctionne :)

Reply

Marsh Posté le 21-12-2005 à 18:10:58    

c'est bon à savoir. Je vais devoir faire evoluer ma version une jour ou l'autrE.


---------------
MZP est de retour
Reply

Marsh Posté le 21-12-2005 à 18:10:58   

Reply

Marsh Posté le 21-12-2005 à 21:33:11    

J'ai la version 3.23.49 :(
Comment mettre a jour mysql dans easyPHP ?

Reply

Marsh Posté le 21-12-2005 à 21:55:29    

will75012 a écrit :

J'ai la version 3.23.49 :(
Comment mettre a jour mysql dans easyPHP ?


Perso j'aurais desinstallé eaysphp et reinstallé la dernier version. Normalement il concerve le repertoire /mysql/data et www/ mais par securité il faut sauvegarder ces deux repertoire. ce que je te dis c'est la methode la plus simple mais sinon je t'aurais conseillé de l'installer séparément.
php, apache, mysql  ainsi c'est plus facile à administrer les mise à jours.

Message cité 1 fois
Message édité par Berceker United le 21-12-2005 à 21:56:34
Reply

Marsh Posté le 22-12-2005 à 16:49:52    

j'ai peut-être pas compris ce que tu voulais au final, mais si tu ne veux que les films, un simple "select titre from dvd_catalogue limit 10" n'irait pas?

Reply

Marsh Posté le 22-12-2005 à 17:02:04    

C'est les 10 premiers films. Et pour chaque film la liste des acteurs.


---------------
MZP est de retour
Reply

Marsh Posté le 22-12-2005 à 17:21:15    

Berceker United a écrit :

Perso j'aurais desinstallé eaysphp et reinstallé la dernier version. Normalement il concerve le repertoire /mysql/data et www/ mais par securité il faut sauvegarder ces deux repertoire. ce que je te dis c'est la methode la plus simple mais sinon je t'aurais conseillé de l'installer séparément.
php, apache, mysql  ainsi c'est plus facile à administrer les mise à jours.


 
J'ai la dernière version (la 1.8) et avec il y a la version 3.23.49 de mysql  :??:

Reply

Marsh Posté le 23-12-2005 à 09:39:53    

ha bon? Tien cela m'étonne. Alors je pense que tu peux quand même désinstaller mysql via le service windows et de le reinstaller de façon autonome.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed