2010-01-13 6 views
0
usertable 
---- 
id, username 

grouptable 
---- 
id, groupname 

group_user 
-------- 
uid, gid 

books 
---- 
id, groupname 

Paramètres d'entrée: groupname, nom d'utilisateur
sortie: liste des livressql optimize recherche beaucoup-beaucoup

Est-il possible d'utiliser 1 instruction SQL pour obtenir la liste des livres quand le nom d'utilisateur est à l'intérieur nomdugroupe

question 2: tout bon livre recommand à maîtriser la déclaration complexe sql ..

+0

Vous ne devriez pas poser deux questions dans un ... – RedFilter

Répondre

1

Cette requête donne la liste des livres par l'utilisateur Parametar

SELECT b.id, 
FROM usertable u 
    INNER JOIN group_user gu ON gu.uid = u.id 
    INNER JOIN grouptable g ON g.id= gu.gid 
    INNER JOIN books b ON b.groupname = g.groupname 
WHERE u.username = @user_name 

Je pense aussi si vous avez le nom du groupe que vous pouvez utiliser

SELECT b.id, 
FROM grouptable g 
    INNER JOIN books b ON b.groupname = g.groupname 
WHERE g.groupname = @group_name 

bus ayant sélectionnez sur les deux paramètres que je pense est pas très bon penser. Cette requête se liste des livres pour le nom du groupe d'utilisateurs

SELECT b.id, 
    FROM usertable u 
     INNER JOIN group_user gu ON gu.uid = u.id 
     INNER JOIN grouptable g ON g.id= gu.gid 
       AND g.group_name = @group_name 
     INNER JOIN books b ON b.groupname = g.groupname 
    WHERE u.username = @user_name 
+0

juste pour confirmer, u utilisez jointure interne. mais le même utilisateur peut avoir plusieurs livres différents. jointure interne signifie 1 table gauche-1 table droite jointure (jointure complète) dans ce cas l'utilisateur unique sera listé ce qui est incorrect ..? désolé si je me trompe et s'il vous plaît expliquer – cometta

+0

en utilisant la clause Where je ne laisse qu'une seule ligne dans l'usertable l'utilisateur avec le nom d'utilisateur le même que la valeur du paramètre. En utilisant la jointure interne, j'obtiens autant de lignes que l'utilisateur en fait partie. Donc, si l'utilisateur est dans 5 groupes, je reçois cinq rangs. Puis je filtre ces groupes par le paramètre @group_name. Je reçois la liste des livres pour ce groupe. Si ce n'est toujours pas clair comment cela fonctionne, remplacez simplement "b.id" par "*" et supprimez toutes les jointures internes et la clause where et commencez à les ajouter une par une pour voir l'effet – IordanTanev