En évitant Produit Cartésien avec des Jointures internes

Je sais que cela a été demandé avant, mais je vais avoir de la difficulté à en saisir. J'ai rarement utiliser SQL brut.

J'ai trois tables - Session, GroupName et GroupSessionFeedback.

Je me joins Session à GroupFeedback sur idUser
et je me joins GroupName à Session sur idGroup colonne.

Voici mon code SQL:

SELECT s.idSession, 
       g.name, 
       s.Assistant, 
       s.idGroup, 
       s.start, 
       s.end, 
       f.value
  FROM rempad.Session s
 INNER JOIN rempad.GroupSessionFeedback f
    ON s.idUser = f.idUser
 INNER JOIN rempad.GroupName g
    ON s.idGroup = g.idGroup
 WHERE s.start BETWEEN '2013-04-28' AND '2013-05-28'
   AND s.idUser = 22
    OR s.idUser = 23
    OR s.idUser = 24
    OR s.idUser = 26
    OR s.idUser = 27
    OR s.idUser = 28
    OR s.idUser = 42;

Je veux ramener unique idSessions mais il est correspondant à plusieurs reprises en raison de la Rejoint et je n'ai pas une idée de ce que d'autres de l'approche à prendre. J'ai pu faire des appels distincts à la base de données - mais je vais vraiment essayer d'éviter le martelage de la base de données comme il est assez lente comme réponse il est.

Des idées?

Merci d'avance

Deux points: vous êtes le mélange ands et ors. And a la préséance sur or, résultant en start filtre être honoré pour iduser 22 seulement. Les autres utilisateurs sont simplement ajoutés à la suite. Voir Mysql ou/et de préséance?. Utilisation in ou de joindre tous les ors entre parenthèses. Deuxième point: si les performances ne s'améliorent pas, alors vous avez probablement besoin de revoir les index.

OriginalL'auteur Linda Keating | 2013-08-31