1-n, déterminer si n > 0 - SQL/NoSQL - Programmation
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...
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... ??
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)
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.
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.
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
Marsh Posté le 31-01-2012 à 14:52:10
Il parle d'un lien hypertexte je crois...
Marsh Posté le 31-01-2012 à 15:43:17
Oui au final ça sera ça
nombre de parent/enfant est égal à 0 --> Pas de lien
nombre de parent/enfant > à 0 --> Afficher un lien pour voir les parents/enfants
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).
Marsh Posté le 31-01-2012 à 16:36:33
Ouioui, je répondais à Rufo, je vais tester ça quand j'aurai 5 minutes
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
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 !