Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/07/2011, 20h40   #1
Invité régulier
 
Inscription : août 2008
Messages : 34
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2008
Messages : 34
Points : 9
Points : 9
Par défaut requête un peu complexe pour moi

'soir tout le monde.

Voilà 3 heures que je cherche (avec ma tête, google et ce forum) sans trouver de solution, je vous la fait courte :
1 table
id_index , id_index_parent , rien_a_voir
1 , 0 , blabla
2 , 1 , blabla
3 , 1 , blabla
4 , 0 , blabla
5 , 4 , blabla
...
...

id_index : index unique auto-incrémenté
id_index_parent : index pouvant pointer vers id_index si id_index à un lien de parenté, si aucun lien de parenté alors 0
rien_a_voir : juste pour le fun.

c'est un peu comme un système de catégorie + sous-catégories, le tout dans la même table.

Ce que j'essaie de faire en 1 requête :
sortie les 10 derniers id_index en associant les XX id_index_parent éventuellement associés.

J'ai essayé avec des jointures, des requêtes imbriquées, mais rien n'y fait, le LIMIT 10 me bloque et me sort toujours 10 résultats même si il y a (par exemple) 20 id_index_parent associés.

Si quelqu'un peut au moins m'aiguiller un peu, ça serait cool ;)
Merci.
remrem59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 09h51   #2
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
Bonjour,

Va voir là : http://sqlpro.developpez.com/cours/arborescence/
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 13h47   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Je ne comprends pas exactement ce que tu souhaites en sortie de requête...
Un petit exemple ?
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 17h36   #4
Invité régulier
 
Inscription : août 2008
Messages : 34
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2008
Messages : 34
Points : 9
Points : 9
@jeca : Merci pour le lien, je l'avais déjà parcouru, mais je n'y trouve pas de solution (toujours ce problème de limit) :/

@ced : mea culpa, j'aurais dû préciser.

En fait je voudrais mettre une limite sur les parents mais pas sur les enfants.
en gros avec un limit 3 DESC sur :
id_index , id_index_parent , rien_a_voir
1 , 0 , blabla1
2 , 1 , blabla2
3 , 1 , blabla3
4 , 0 , blabla4
5 , 1 , blabla5
6 , 4 , blabla6
7 , 0 , blabla7

en sortie le limit 3 s'applique sur l'id_index ayant un id_index_parent = 0 et dans la même requête, sortir sans limite les champs ayant les id_index_parent associés id_index sortant :
7 , 0 , blabla7 // assujetti au limit 3
4 , 0 , blabla4 // assujetti au limit 3
6 , 4 , blabla6 // id_index_parent = id_index = 4 // non assujetti au limit 3
1 , 0 , blabla1 // assujetti au limit 3
5 , 1 , blabla5 // id_index_parent = id_index = 1 // non assujetti au limit 3
3 , 1 , blabla3 // id_index_parent = id_index = 1 // non assujetti au limit 3
2 , 1 , blabla2 // id_index_parent = id_index = 1 // non assujetti au limit 3

les "enfants" peuvent sortir dans le "fil" des parents ou sortir avant ou après les parents :
7 , 0 , blabla7 // assujetti au limit 3
4 , 0 , blabla4 // assujetti au limit 3
1 , 0 , blabla1 // assujetti au limit 3
6 , 4 , blabla6 // id_index_parent = id_index = 4 // non assujetti au limit 3
5 , 1 , blabla5 // id_index_parent = id_index = 1 // non assujetti au limit 3
3 , 1 , blabla3 // id_index_parent = id_index = 1 // non assujetti au limit 3
2 , 1 , blabla2 // id_index_parent = id_index = 1 // non assujetti au limit 3

Pour l'instant, j’extrais tout les champs de la table et applique la limite en php (boucle dans boucle), ça fonctionne, mais cette table est appelée à avoir des milliers d'enregistrements et ça va devenir très lourd ...

En tout cas merci pour vos réponses.
remrem59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 17h02   #5
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 853
Points : 1 332
Points : 1 332
c'est simple en fait, tu peux le faire avec ça :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DROP procedure trouve;
delimiter |
CREATE procedure trouve()
begin
DROP TABLE IF EXISTS principaux;
CREATE TEMPORARY TABLE principaux SELECT id FROM ta_table WHERE tes_conditions LIMIT 10;
(SELECT tes_champs FROM ta_table WHERE id
IN (SELECT id FROM principaux))
union
(SELECT tes champs FROM ta_table WHERE id_index_parent
IN (SELECT id FROM principaux));
DROP TABLE principaux;
end|
delimiter ;

tu appelles avec un call ta procédure... et du coup tout le traitement se passe côté serveur mysql pas d'aller-retour inutiles

tes_conditions représente ce que tu cherches, à toi de remplacer avec ce qui va bien...
tes_champs représente la liste des champs que tu veux afficher, à toi de remplacer par ce qu'il faut...

tu peux aussi faire la même chose en une seule requête mais ça serait, je pense, moins performant, car tu devrais refaire 2 fois la recherche des id des 10 éventuels résultats principaux. Là, tu ne la fais qu'une fois...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 17h07   #6
Invité régulier
 
Inscription : août 2008
Messages : 34
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2008
Messages : 34
Points : 9
Points : 9
Pas bête
Je teste ça ce soir et je cloture si c'est ok

En tout cas, merci pour le coup de main
remrem59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h08.


 
 
 
 
Partenaires

Hébergement Web