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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  1-n, déterminer si n > 0

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

1-n, déterminer si n > 0

n°2124038
gooopil
pfiew
Posté le 30-01-2012 à 23:45:47  profilanswer
 

Hello,
 
Sur un MySQL 5 :
J'ai des "Trucs" avec des parents et des enfants. Je veux afficher un lien seulement si un Truc a au moins un enfant ou parent.
 
Pour l'instant, j'ai, en ne gardant que ce qui est pertinent

Code :
  1. SELECT string_id,
  2.            current_text,
  3.            (SELECT count() FROM parents WHERE parents.string_id=string_id) AS parentscount, 
  4.            (SELECT count(0) FROM enfants WHERE enfants.string_id=string_id) AS enfantscount,
  5.            FROM trucs
  6.            WHERE MATCH (current_text) AGAINST ("query" )


J'ai un index dans chaque table parents et enfants, sur string_id.  
 
En rajoutant les deux SELECT count, ça a doublé le temps de réponse (y'a des centaines de milliers de trucs, et des des millions de mots dans les colonnes text). J'me dit que compter le nombre de colonne n'est pas très efficace sachant que je veux juste savoir s'il y en a au moins une qui correspond...
 
Une suggestion ?  
 
Merci !
 
 
 

mood
Publicité
Posté le 30-01-2012 à 23:45:47  profilanswer
 

n°2124081
rufo
Pas me confondre avec Lycos!
Posté le 31-01-2012 à 10:27:05  profilanswer
 

En refaisant ta requête avec des LEFT JOIN et en vérifiant que la colonne "enfant" ou parent n'est pas NULL ou alors en refaisant ta requête avec des EXISTS.
 
Edit : si tu nous montrais la structure de tes tables, on y verrait plus clair...


Message édité par rufo le 31-01-2012 à 10:27:33

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2124087
gooopil
pfiew
Posté le 31-01-2012 à 10:55:55  profilanswer
 

Désolé, je pensais que ma description était assez claire ;)
 
En gros, en extrayant :
 
Truc :
  string_id (pk)
  current_text...
 
Parents
  string_id (le Truc maître)
  parent_id (le Truc lié)
 
Enfants
  string_id (le Truc maître)
  enfant_id (le Truc lié)
 
 
Avec exists, je peux faire un truc du genre :
Select string_id, (Exists (Select 1 FROM parents WHERE parents.string_id=string_id)) as hasParents FROM trucs... ??


Message édité par gooopil le 31-01-2012 à 10:56:05
n°2124098
Oliiii
Posté le 31-01-2012 à 11:43:48  profilanswer
 

Select a.string_id
From Truc a
    Left Join Parents b on b.string_id = a.string_id
    Left Join Enfants c on c.string_id = a.string_id
Where b.string_id is not null
    Or c.string_id is not null
 
Tu ne dois pas vraiment avoir une table Enfant et une table Parent, tu pourrais avoir un table Relation avec string_id, relation_id, relation_type.
Ca te simplifierai la tache.
 
Sinon d'un point de vue efficacité tu devrai pouvoir aller plus vite avec ca:
Select a.string_id
From Truc a
    Join (Select string_id from Parents UNION Select string_id from Enfants) b on b.string_id = a.string_id
 
Le UNION devrait enlever les doubles (a verifier dans ton SGBD)

n°2124112
gooopil
pfiew
Posté le 31-01-2012 à 12:14:59  profilanswer
 

Ouais les deux tables parents/enfants stun fail de ma part...
 
La requête que tu me proposes, ça va pas seulement me retourner les Trucs qui ont au moins un parent/enfant ? Ce que je veux, c'est pour chaque Truc retourné, savoir s'il existe au moins un parent/enfant.  

n°2124120
Oliiii
Posté le 31-01-2012 à 13:06:38  profilanswer
 

Tu as demandé: Je veux afficher un lien seulement si un Truc a au moins un enfant ou parent.  
 
Bon maintenant mon interpretation du mot lien n'est peut etre pas bonne :)
 
Tu remplaces le Join par un Left Join et ca fonctionnera comme tu veux.

n°2124126
gooopil
pfiew
Posté le 31-01-2012 à 13:23:40  profilanswer
 

Ouais, je suis pas toujours clair ;)
je veux afficher tous les Trucs qui répondent à ma recherche, et pour ceux qui ont au moins un enfant/parent, afficher un lien détail. D'où mon besoin de savoir si le nombre de parent/enfant est égal à 0 ou pas.  
 
Ma requête de base fait ça, mais me retourne un count, pas forcément le plus efficace. Je vais tester ta proposition, en lisant la requête j'ai l'impression que ça me filtre les Trucs plutôt que de me rajouter l'info "nombre de parent/enfant > 0 ?". Mais bon, ça serait pas la première fois que je comprends une requête de travers [:tinostar]

n°2124159
rufo
Pas me confondre avec Lycos!
Posté le 31-01-2012 à 14:52:10  profilanswer
 

Il parle d'un lien hypertexte je crois...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2124187
gooopil
pfiew
Posté le 31-01-2012 à 15:43:17  profilanswer
 

Oui au final ça sera ça :jap:
 
nombre de parent/enfant est égal à 0 --> Pas de lien
nombre de parent/enfant > à 0 --> Afficher un lien pour voir les parents/enfants

n°2124190
Oliiii
Posté le 31-01-2012 à 16:04:37  profilanswer
 

Comme je l'ai déja dit, tu remplaces le JOIN par un LEFT JOIN dans le deuxieme query.
Si tu veux utiliser la premiere, tu vires le Where et tu ajoutes un distinct (sauf si tu veux avoir les détails dans la meme query).

mood
Publicité
Posté le 31-01-2012 à 16:04:37  profilanswer
 

n°2124199
gooopil
pfiew
Posté le 31-01-2012 à 16:36:33  profilanswer
 

Ouioui, je répondais à Rufo, je vais tester ça quand j'aurai 5 minutes :jap:


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

  1-n, déterminer si n > 0

 

Sujets relatifs
Déterminer une fin de paragraphe dans un textedéterminer le nombre de lignes d'un fichier texte
determiner l'origine d'un fichier[Webservice] Determiner l'url du service du serveur
JAVA : Déterminer l'état du capslockdéterminer la vitesse d'un axe à partir d'impulsion d'un capteur
déterminer l'angle de deux droites choisies par l'utilisateurdéterminer l'angle de deux droites choisies par l'utilisateur
Déterminer la position d'un enregistrement 
Plus de sujets relatifs à : 1-n, déterminer si n > 0


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)