Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1805 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MYSQL] Requete complexe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MYSQL] Requete complexe

n°1592754
limpkin
C'est subjectif.
Posté le 28-07-2007 à 18:27:29  profilanswer
 

Bonjour!
 
Ma question est assez simple, mais je n'arrive pas à trouver la solution.
 
J'ai une table mysql avec deux champs: un index (id), et une id de description
Pour un meme id je peux avoir plusieurs id de description, donc plusieurs entrées dans la table.
 
J'aimerai faire une requete qui mettrai d'obtenir une id ayant deux id de descriptions particulieres ou plus :)
 
Merci

mood
Publicité
Posté le 28-07-2007 à 18:27:29  profilanswer
 

n°1592790
theredled
● REC
Posté le 28-07-2007 à 20:58:54  profilanswer
 

Il te faut 3 colonnes alors :
id (clé primaire, auto-increment, pas de doublons)
id_truc
id_description
 
après pour ta requete j'ai pas compris ? ta table est faite déja ? avec ce que tu dis je penses que non...


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1592791
limpkin
C'est subjectif.
Posté le 28-07-2007 à 21:00:29  profilanswer
 

La table est deja faite.
 
Je me souviens déja avoir eu ce probleme il y a un bail. Je pense qu'il faut faire une requete par id de description, puis joindre les requetes entre elles

n°1592793
theredled
● REC
Posté le 28-07-2007 à 21:04:20  profilanswer
 

limpkin a écrit :

La table est deja faite.

 

Je me souviens déja avoir eu ce probleme il y a un bail. Je pense qu'il faut faire une requete par id de description, puis joindre les requetes entre elles


A priori, surement une histoire de SELECT COUNT(machin) FROM table GROUP BY blabla

 

Mais tu peux filer ta table parce j'ai du mal à imaginer une table avec un champ id qui puisse contenir des doublons ? ("un meme id je peux avoir plusieurs id de description" )


Message édité par theredled le 28-07-2007 à 21:05:36

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1592794
limpkin
C'est subjectif.
Posté le 28-07-2007 à 21:05:03  profilanswer
 

Si tu veux, tu veux une capture ou l'export?

n°1592795
limpkin
C'est subjectif.
Posté le 28-07-2007 à 21:06:07  profilanswer
 

Vla pour l'export:  
 


CREATE TABLE `jeunes_interests` (
  `id` mediumint(8) unsigned NOT NULL default '0',
  `id_interest` tinyint(3) unsigned NOT NULL default '0',
  KEY `id` (`id`),
  KEY `id_interest` (`id_interest`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
--  
-- Contenu de la table `jeunes_interests`
--  
 
INSERT INTO `jeunes_interests` (`id`, `id_interest`) VALUES (2, 4),
(2, 5),
(2, 8),
(1, 2),
(1, 4),
(1, 8),
(3, 1),
(3, 2),
(3, 4),
(4, 1),
(4, 2),
(4, 4),
(4, 7),
(5, 2),
(5, 3),
(5, 4),
(5, 5),
(5, 7);

n°1592797
theredled
● REC
Posté le 28-07-2007 à 21:06:42  profilanswer
 

Un petit bout d'exemple, la structure puis un peu de contenu quoi pour illustrer.


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1592798
limpkin
C'est subjectif.
Posté le 28-07-2007 à 21:07:31  profilanswer
 

L'id est l'id de l'user, et l'id_interest un id qui decrit un loisir

n°1592802
theredled
● REC
Posté le 28-07-2007 à 21:14:22  profilanswer
 

limpkin a écrit :

Vla pour l'export:

 


CREATE TABLE `jeunes_interests` (
  `id` mediumint(8) unsigned NOT NULL default '0',
  `id_interest` tinyint(3) unsigned NOT NULL default '0',
  KEY `id` (`id`),
  KEY `id_interest` (`id_interest`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

--
-- Contenu de la table `jeunes_interests`
--

 

INSERT INTO `jeunes_interests` (`id`, `id_interest`) VALUES (2, 4),
(2, 5),
(2, 8),
(1, 2),
(1, 4),
(1, 8),
(3, 1),



Ah dac, tu n'as pas de clé primaire... ça serait mieux avec, même si ici ça change pas gd-chose.

 

Tu veux obtenir une liste de tous les "id" ayant plus d'une occurence dans la table c'est ça ?
Si c'est ça ya ça qui devrait marcher :

Code :
  1. SELECT j.id FROM
  2.    (SELECT id, COUNT(id) AS nb_interests FROM jeunes_interests GROUP BY id
  3.    ) AS j
  4. WHERE j.nb_interests > 1


je vois pas plus simple mais jme trompe ptet.

Message cité 1 fois
Message édité par theredled le 28-07-2007 à 21:15:08

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1592804
KangOl
Profil : pointeur
Posté le 28-07-2007 à 21:16:21  profilanswer
 

having :o

mood
Publicité
Posté le 28-07-2007 à 21:16:21  profilanswer
 

n°1592806
theredled
● REC
Posté le 28-07-2007 à 21:20:08  profilanswer
 

OMFG :D
 
Ouais, donc t'as Having aussi :o


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1592809
limpkin
C'est subjectif.
Posté le 28-07-2007 à 21:33:53  profilanswer
 

theredled a écrit :


Tu veux obtenir une liste de tous les "id" ayant plus d'une occurence dans la table c'est ça ?
je vois pas plus simple mais jme trompe ptet.

 

Nope, je veux la liste des id ayant plusieurs id de descriptions precises (obtenues par des cases à cocher pr etre precis)

Message cité 1 fois
Message édité par limpkin le 28-07-2007 à 21:34:41
n°1592812
theredled
● REC
Posté le 28-07-2007 à 21:55:11  profilanswer
 

limpkin a écrit :

 

Nope, je veux la liste des id ayant plusieurs id de descriptions precises (obtenues par des cases à cocher pr etre precis)


donne un exemple stp


Message édité par theredled le 28-07-2007 à 21:56:10

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1592814
limpkin
C'est subjectif.
Posté le 28-07-2007 à 21:57:11  profilanswer
 

CREATE TABLE `id_interest` (
  `id` tinyint(3) unsigned NOT NULL auto_increment,
  `description` varchar(100) collate latin1_general_ci NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=9 ;
 
--  
-- Contenu de la table `id_interest`
--  
 
INSERT INTO `id_interest` VALUES (1, 'Cinéma');
INSERT INTO `id_interest` VALUES (2, 'Musique');
INSERT INTO `id_interest` VALUES (3, 'Informatique');
INSERT INTO `id_interest` VALUES (4, 'Lecture');
INSERT INTO `id_interest` VALUES (5, 'Sport');
INSERT INTO `id_interest` VALUES (6, 'Bricolage');
INSERT INTO `id_interest` VALUES (7, 'Associatif / Bénévolat');
INSERT INTO `id_interest` VALUES (8, 'Autre');


 
Quelqu'un s'inscrit sur le site, rentre ses centres d'interets via plein de cases à cocher.
A chaque centre d'interet il y aura une requete sql avec l'identifiant de l'user + id centre d'interet.
 
Moi je veux savoir qui a par exemple comme centre d'interet le cinéma ET la musique

n°1592815
KangOl
Profil : pointeur
Posté le 28-07-2007 à 21:58:10  profilanswer
 

bha avec des exists ...

n°1592816
limpkin
C'est subjectif.
Posté le 28-07-2007 à 21:58:48  profilanswer
 

Un petit exemple? :ange: :)

n°1592817
KangOl
Profil : pointeur
Posté le 28-07-2007 à 22:05:10  profilanswer
 

Code :
  1. SELECT *
  2.  FROM user
  3. WHERE EXISTS ( SELECT 1
  4.                  FROM jeunes_interests
  5.                 WHERE id = user.id
  6.                   AND id_interest = 1 ) -- cinema
  7.   AND EXISTS  ( SELECT 1
  8.                   FROM jeunes_interests
  9.                  WHERE id = user.id
  10.                    AND id_interest = 2 ) -- musique
  11. ;

Message cité 1 fois
Message édité par KangOl le 28-07-2007 à 22:24:09
n°1592818
limpkin
C'est subjectif.
Posté le 28-07-2007 à 22:18:21  profilanswer
 

Sympa!
 
Merci!!!!! :) :)

n°1592819
theredled
● REC
Posté le 28-07-2007 à 22:20:43  profilanswer
 

Ca va être EXISTS en mysql par contre


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1592820
limpkin
C'est subjectif.
Posté le 28-07-2007 à 22:22:48  profilanswer
 

Je suis entrain de reflechir sur comment eviter de passer par la table user comme tu l'as fais

n°1592821
KangOl
Profil : pointeur
Posté le 28-07-2007 à 22:23:11  profilanswer
 

theredled a écrit :

Ca va être EXISTS en mysql par contre


comme dans tous les autres sgbd

 

c'est une erreur de ma part

 

je vais editer ...


Message édité par KangOl le 28-07-2007 à 22:23:52
n°1592823
limpkin
C'est subjectif.
Posté le 28-07-2007 à 22:27:01  profilanswer
 

Niquel ca marche!
 
Je vous remercie encore
 

SELECT id
FROM jeunes_id
WHERE EXISTS (
 
SELECT *
FROM jeunes_interests
WHERE jeunes_id.id = jeunes_interests.id
AND id_interest =5
)
AND EXISTS (
 
SELECT *
FROM jeunes_interests
WHERE jeunes_id.id = jeunes_interests.id
AND id_interest =8
)
AND EXISTS (
 
SELECT *
FROM jeunes_interests
WHERE jeunes_id.id = jeunes_interests.id
AND id_interest =2
)

n°1592824
theredled
● REC
Posté le 28-07-2007 à 22:28:46  profilanswer
 

limpkin a écrit :

Je suis entrain de reflechir sur comment eviter de passer par la table user comme tu l'as fais


KangOl a écrit :

Code :
  1. SELECT DISTINCT(j.id)
  2.  FROM jeunes_interests AS j
  3. WHERE EXISTS ( SELECT 1
  4.                  FROM jeunes_interests
  5.                 WHERE id = j.id
  6.                   AND id_interest = 1 ) -- cinema
  7.   AND EXISTS  ( SELECT 1
  8.                   FROM jeunes_interests
  9.                  WHERE id = j.id
  10.                    AND id_interest = 2 ) -- musique
  11. ;



Un peu plus lent peut-etre, à voir.
 
Par contre KangOl je trouve ta requete un peu longue et redondante... Mais je trouve pas mieux :D


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°1592825
KangOl
Profil : pointeur
Posté le 28-07-2007 à 22:29:55  profilanswer
 

dans les exists, pas besoin de faire des select *, un select 1 suffit (vu que tu teste juste l'existence)

n°1592832
limpkin
C'est subjectif.
Posté le 28-07-2007 à 22:34:55  profilanswer
 

Ah oui en effet :)

n°1595809
limpkin
C'est subjectif.
Posté le 04-08-2007 à 11:14:48  profilanswer
 

Hello tout le monde!  
 
J'ai un autre petit probleme:
 

AND EXISTS (SELECT binome_event.id, COUNT(*) AS nbr FROM `binome_event` WHERE binome_event.id = binomes.id GROUP BY binome_event.id HAVING nbr = 2)


 
la requete est bien sur sur le champs binomes.id, seulement cette requete marche SEULEMENT quand il y a au moins une entrée avec la bonne id dans la table binome_event >> J'aurai d'affiché tout les id n'ayant pas d'entrées dans la table binome_event :(

n°1595812
limpkin
C'est subjectif.
Posté le 04-08-2007 à 11:25:07  profilanswer
 

Bon, en ajoutant juste avant la meme requete en AND sans le group by (pour etre sur qu'il y a des elements) ca passe mais bon... c'est pas très très propre

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MYSQL] Requete complexe

 

Sujets relatifs
Synchroniser table access et serveur MysqlComparaison de mot de passe mysql/php
[RESOLU] MySQL jointure sur clé primaire LENTE[MySQL]Installation Drivers ODBC sous Vista en lignes de commandes
[MYSQL] Update un peu torduRequete mysql complexe
(RESOLU) [PHP / Mysql] Requete SELECT très complexe[MySql] Pb de requete complexe
[Concours] Votre Requête MySQL la plus complexe[mysql] requete trop complexe pour moi
Plus de sujets relatifs à : [MYSQL] Requete complexe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR