2010-01-20 3 views
1

J'ai deux tables, 'discussion' et 'discussion_responses'. Un identifiant unique de 'discussion' est utilisé dans 'discussion_responses' pour identifier la réponse à la publication originale dans un forum. J'ai créé la requête suivante pour extraire les messages qui ont de NOUVELLES réponses, mais qui ne sont PAS liés à de nouveaux sujets. Les deux tableaux ont un champ pour la date ajoutée et « colname » est le nom de la variable de Dreamweaver pour la dernière date de connexion dans le visiteur récupéré d'une autre table:Réduire le jeu d'enregistrements où un champ particulier a des données similaires. (MySQL)

SELECT * 
FROM discussion, discussion_responses 
WHERE discussion.discussion_date < colname 
AND discussion_responses.discussion_date > colname 
AND discussion.discussion_ID = discussion_responses.discussion_ID 
ORDER BY discussion.discussion_title ASC 

Mon problème est que lorsque plus d'une réponse est faite à le post original, j'ai naturellement plus d'un résultat pour cet ID de discussion. Est-ce que quelqu'un peut me conseiller sur la façon dont je peux éliminer les lignes suivantes contenant le même ID de discussion? Peu importe quel enregistrement est choisi, seulement que je reçois l'ID de tout sujet auquel une nouvelle réponse a été associée. Merci.

Répondre

0

Si vous êtes seulement intéressé par l'ID de discussion, vous pouvez utiliser distinct ou group by. Voici un exemple avec distinct:

SELECT  DISTINCT discussion_ID 
FROM  discussion d 
INNER JOIN discussion_responses dr 
ON   d.discussion_ID = dr.discussion_ID 
WHERE  d.discussion_date < colname 
AND   dr.discussion_date > colname 

Si vous êtes également intéressé par d'autres colonnes, filtre les années distinctes de id dans une sous-requête:

SELECT  * 
FROM  discussion d 
WHERE  d.discussion_ID IN (
    <query from above here> 
) 
+0

Merci, les gars. Cela a fonctionné un régal. – Richard

1

ceci:

SELECT * 
FROM discussion d 
WHERE discussion_date < colname 
     AND EXISTS 
     (
     SELECT NULL 
     FROM discussion_responses dr 
     WHERE dr.discussion_date > colname 
       AND dr.discussion_ID = d.discussion_ID 
     ) 
ORDER BY 
     d.discussion_title ASC 

ou cette :

SELECT d.* 
FROM (
     SELECT DISTINCT discussion_ID 
     FROM discussion_responses dr 
     WHERE dr.discussion_date > colname 
     ) 
JOIN discussion d 
ON  d.discussion_ID = dr.discussion_ID 
WHERE d.discussion_date < colname 
ORDER BY 
     d.discussion_title ASC 

Le latte La requête r sera probablement plus rapide, car la condition utilisée dans la table principale (discussion_responses) de la deuxième requête est plus sélective.

Créez un index sur discussion_responses (discussion_date, discussion_id).

Questions connexes