[MYSQL] Requete complexe

Requete complexe [MYSQL] - SQL/NoSQL - Programmation

Marsh Posté le 28-07-2007 à 18:27:29    

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

Reply

Marsh Posté le 28-07-2007 à 18:27:29   

Reply

Marsh Posté le 28-07-2007 à 20:58:54    

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
Reply

Marsh Posté le 28-07-2007 à 21:00:29    

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

Reply

Marsh Posté le 28-07-2007 à 21:04:20    

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
Reply

Marsh Posté le 28-07-2007 à 21:05:03    

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

Reply

Marsh Posté le 28-07-2007 à 21:06:07    

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);

Reply

Marsh Posté le 28-07-2007 à 21:06:42    

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
Reply

Marsh Posté le 28-07-2007 à 21:07:31    

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

Reply

Marsh Posté le 28-07-2007 à 21:14:22    

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
Reply

Marsh Posté le 28-07-2007 à 21:16:21    

having :o

Reply

Marsh Posté le 28-07-2007 à 21:16:21   

Reply

Marsh Posté le 28-07-2007 à 21:20:08    

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
Reply

Marsh Posté le 28-07-2007 à 21:33:53    

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
Reply

Marsh Posté le 28-07-2007 à 21:55:11    

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
Reply

Marsh Posté le 28-07-2007 à 21:57:11    

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

Reply

Marsh Posté le 28-07-2007 à 21:58:10    

bha avec des exists ...

Reply

Marsh Posté le 28-07-2007 à 21:58:48    

Un petit exemple? :ange: :)

Reply

Marsh Posté le 28-07-2007 à 22:05:10    

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
Reply

Marsh Posté le 28-07-2007 à 22:18:21    

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

Reply

Marsh Posté le 28-07-2007 à 22:20:43    

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
Reply

Marsh Posté le 28-07-2007 à 22:22:48    

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

Reply

Marsh Posté le 28-07-2007 à 22:23:11    

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
Reply

Marsh Posté le 28-07-2007 à 22:27:01    

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
)

Reply

Marsh Posté le 28-07-2007 à 22:28:46    

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
Reply

Marsh Posté le 28-07-2007 à 22:29:55    

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

Reply

Marsh Posté le 28-07-2007 à 22:34:55    

Ah oui en effet :)

Reply

Marsh Posté le 04-08-2007 à 11:14:48    

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 :(

Reply

Marsh Posté le 04-08-2007 à 11:25:07    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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