Requete sql faire une sous requete

Fermé
momohuri Messages postés 235 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 9 février 2012 - 16 sept. 2011 à 14:45
momohuri Messages postés 235 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 9 février 2012 - 16 sept. 2011 à 16:33
Bonjour,

j ai une requete du genre :
select .... FROM matable WHERE (visibilite =1 AND idcreateur IN (select * from amis where id =1 ))

grosso modo le truc c est qui faut que idcreateur soit dans une des colone de la table amis . La table ressemble a :

id idamis1 idamis2....

Merci


2 réponses

Utilisateur anonyme
16 sept. 2011 à 15:20
Bonjour,

Ce genre de syntaxe en SQL n'est pas possible.
Une sous requête doit renvoyer une seule colonne.

Il faudrait travailler ainsi

select
...
from matable, amis
where
amis.id = 1
matable.visibilite=1
and
(
(matable.idcreateur=amis.idamis1)
or
(matable.idcreateur=amis.idamis2)
...
)

Mais je pense que c'est plus du à une erreur de conception de la base

la table amis devrait être du genre
id1, id2

ou id1 est l'amis de id2

du genre
1,2
1,3
1,4

2,3
2,4
....
0
momohuri Messages postés 235 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 9 février 2012 8
Modifié par momohuri le 16/09/2011 à 15:31
pour la table je pourrait faire ce que tu dit aussi mais dans ce cas la ca veut dire qu on arrive a nbrdegens *nbrdamis avec 2 colone pour chaque pour le nbr de ligne.
Donc pour 1000 personne qui sont amis entre elle on arrive a 200 000 champ


Or avec ma methode on est a nbrdegens avec x colones(mis a 100 pour le moment)
donc 100 000 pour ma methode
et plus il y a des gens plus ta méthode fait une exponentielle.


c est vraiment mieux de faire plein de ligne plutot que plein de colone?
0
Utilisateur anonyme
16 sept. 2011 à 15:35
En SQL on ne multiplie pas les colonnes, c'est une règle d'or

Le nombre de ligne importe, mais si les indexes sont bien placés...
Et puis avec ton système, on est fatalement limité à un certain nombre d'amis, pas ans le mien.

De plus il y aura un peu moins de lignes :
si 1 est amis avec 2, inutile de préciser que 2 est amis avec 1, on le sait

Après tu fais comme tu veux.
0
momohuri Messages postés 235 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 9 février 2012 8
16 sept. 2011 à 15:45
ca marche merci pour cette petit aide
0
Tu as tout compris, il faut avec un SGBD faire plein de lignes mais JAMAIS plein de colonnes ! Tout est dit.
0
momohuri Messages postés 235 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 9 février 2012 8
16 sept. 2011 à 16:03
ca marche, au passage tu a parle d indexes, je fait ca comment ?^^
0
Utilisateur anonyme
16 sept. 2011 à 16:12
Tu ne sais pas gérer les indexes ???

Alors avant toute chose, avant de te lancer dans la programmation SQL,
il va te falloir ouvrir un livre sur le sujet, ou trouver un bon cours, désolé d'être aussi direct.

Les indexes sont les nerfs de la base de données, sans index, toute tes requêtes vont patiner. Un index permet d'accéder rapidement (données triées) à un enregistrement, sans indexe, le système est obligé de parcourir presque tous les enregistrements, imagine, je bosse avec tables de plus de huit millions d'enregistrements sous Oracle alors...

Pour créer un indexe la commande SQL est

create index nom_index on nom_table (nom_champ_concerne,.....)

Mais il y des indexes primaires, secondaires (clefs)

Avant de créer des indexes, il faut bien comprendre quel champ servira principalement dans les requêtes, bref faire une analyse au préalable, en fait c'est un métier 8-)
0