1-n, déterminer si n > 0

1-n, déterminer si n > 0 - SQL/NoSQL - Programmation

Marsh Posté le 30-01-2012 à 23:45:47    

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 !
 
 
 

Reply

Marsh Posté le 30-01-2012 à 23:45:47   

Reply

Marsh Posté le 31-01-2012 à 10:27:05    

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
Reply

Marsh Posté le 31-01-2012 à 10:55:55    

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
Reply

Marsh Posté le 31-01-2012 à 11:43:48    

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)

Reply

Marsh Posté le 31-01-2012 à 12:14:59    

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.  

Reply

Marsh Posté le 31-01-2012 à 13:06:38    

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.

Reply

Marsh Posté le 31-01-2012 à 13:23:40    

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]

Reply

Marsh Posté le 31-01-2012 à 14:52:10    

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
Reply

Marsh Posté le 31-01-2012 à 15:43:17    

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

Reply

Marsh Posté le 31-01-2012 à 16:04:37    

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

Reply

Marsh Posté le 31-01-2012 à 16:04:37   

Reply

Marsh Posté le 31-01-2012 à 16:36:33    

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

Reply

Sujets relatifs:

Leave a Replay

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