2009-09-23 18 views
1

J'ai une page ASP classique qui permet aux utilisateurs de rechercher des propriétés et une page de résultats qui envoie ensuite un e-mail aux agents immobiliers qui ont des propriétés correspondantes pour les informer de leurs propriétés.Envoyer un e-mail à DISTINCT email

Certains agents peuvent avoir plus d'une propriété, auquel cas l'agent n'a besoin que de recevoir 1 e-mail plutôt qu'un e-mail pour chaque propriété dont ils disposent. Actuellement mon code fait le dernier et j'en ai besoin pour envoyer seulement 1 email à chaque agent.

Dans le code ci-dessous j'ai 2 jeux d'enregistrements; rspropertyresults affiche toutes les propriétés correspondantes, puis j'ai des rsemailagents qui sont utilisés pour rassembler l'adresse email de l'agent et lui envoyer un email.

Je me demandais si quelqu'un pourrait être en mesure de voir comment je peux modifier la requête sql pour rsemailagents pour envoyer 1 email par agent?

<% 
[...] 
rsemailagents.Source = "SELECT *" 
rsemailagents.Source = rsemailagents.Source& "FROM (" 
rsemailagents.Source = rsemailagents.Source& "  SELECT ContentID" 
rsemailagents.Source = rsemailagents.Source& "  FROM (" 
rsemailagents.Source = rsemailagents.Source& "    SELECT ContentID" 
rsemailagents.Source = rsemailagents.Source& "    FROM VWTenantPropertiesResults" 
rsemailagents.Source = rsemailagents.Source& "    WHERE ContentStreet = '" & Replace(rsemailagents__varReqStreet, "'", "''") & "'" 
rsemailagents.Source = rsemailagents.Source& "    UNION ALL" 
rsemailagents.Source = rsemailagents.Source& "    SELECT ContentID" 
rsemailagents.Source = rsemailagents.Source& "    FROM VWTenantPropertiesResults" 
rsemailagents.Source = rsemailagents.Source& "    WHERE ContentTown = '" & Replace(rsemailagents__varReqTown, "'", "''") & "'" 
rsemailagents.Source = rsemailagents.Source& "    UNION ALL" 
rsemailagents.Source = rsemailagents.Source& "    SELECT ContentID" 
rsemailagents.Source = rsemailagents.Source& "    FROM VWTenantPropertiesResults" 
rsemailagents.Source = rsemailagents.Source& "    WHERE ContentTrimmedPostCode LIKE '" & Replace(varPostcode, "'", "''") & "%'" 
rsemailagents.Source = rsemailagents.Source& "    ) qi" 
rsemailagents.Source = rsemailagents.Source& "  GROUP BY" 
rsemailagents.Source = rsemailagents.Source& "    ContentID" 
rsemailagents.Source = rsemailagents.Source& "  HAVING COUNT(*) >= 2" 
rsemailagents.Source = rsemailagents.Source& "  ) q " 
rsemailagents.Source = rsemailagents.Source& "JOIN VWTenantPropertiesResults r " 
rsemailagents.Source = rsemailagents.Source& "ON  r.ContentID = q.ContentID " 
rsemailagents.Source = rsemailagents.Source& "WHERE ContentBedrooms BETWEEN " & Replace(rsemailagents__varBedroomsNoMin, "'", "''") & " " 
rsemailagents.Source = rsemailagents.Source& "AND  " & Replace(rsemailagents__varBedroomsNoMax, "'", "''") & " " 
rsemailagents.Source = rsemailagents.Source& "AND  ContentPrice BETWEEN " & Replace(rsemailagents__varPriceMin, "'", "''") & " " 
rsemailagents.Source = rsemailagents.Source& "AND  " & Replace(rsemailagents__varPriceMax, "'", "''") & " " & varSQL & " " 
rsemailagents.Source = rsemailagents.Source& "ORDER BY" 
rsemailagents.Source = rsemailagents.Source& "  ContentPrice " & Replace(rsemailagents__varSortWay, "'", "''") & " " 
rsemailagents.Source = rsemailagents.Source& "GROUP BY CustomerEmail" 

[...] 
%> 

Dans mon code de messagerie, j'ai défini objMail.To comme suit;

objMail.To = (rsemailagents.Fields.Item("CustomerEmail").Value) 

Ceci est le code VWTenantPropertiesResults; Lorsque j'exécute cette requête dans la base de données, elle renvoie simplement une colonne CustomerEmail et rien d'autre;

SELECT DISTINCT CustomerEmail 
FROM (
    SELECT ContentID 
    FROM (
       SELECT ContentID 
       FROM VWTenantPropertiesResults 
       WHERE ContentStreet = 'Hull' 
       UNION ALL 
       SELECT ContentID 
       FROM VWTenantPropertiesResults 
       WHERE ContentTown = '' 
       UNION ALL 
       SELECT ContentID 
       FROM VWTenantPropertiesResults 
       WHERE ContentTrimmedPostCode LIKE 'HU7' 
       ) qi 
     GROUP BY 
       ContentID 
     HAVING COUNT(*) >= 2 
     ) q 
JOIN VWTenantPropertiesResults r 
ON  r.ContentID = q.ContentID 
WHERE ContentBedrooms BETWEEN 1 AND 10 AND ContentPrice BETWEEN 1 AND 10 
+1

Peut-être que vous devriez simplement publier l'instruction SQL elle-même et non le code qui l'entoure. Ne pouvez-vous pas lancer le SQL à une procédure stockée ou utiliser quelque chose comme DatabaseSpy pour le tester? –

+0

Pourriez-vous s'il vous plait mettre en ligne la structure de votre tableau? – Quassnoi

+0

Pourriez-vous s'il vous plaît afficher et publier toute la requête qui donne l'erreur? Je veux dire la requête elle-même, pas le code avec lequel elle est générée. – Quassnoi

Répondre

2

Mettez votre requête dans la clause IN de cette requête

SELECT email 
FROM agents 
WHERE id IN 
     (
     SELECT agentID 
     FROM … 
     ) 

Cela sélectionnera chaque agent une seule fois.

+0

@Quassnoi Serait-il quelque chose comme ça? SELECT customerEmail DE VWTenantPropertiesResults OU DANS CustomerID ( \t SELECT ContentID \t DE ( \t \t SELECT ContentID " \t \t DE VWTenantPropertiesResults" \t \t OÙ ContentStreet = « » et remplacer (rsemailagents__varReqStreet, " '", " ''") et "'" \t \t UNION ALL " \t \t SELECT ContentID" \t \t DE VWTenantPropertiesResults » \t \t OÙ ContentTown = « "et remplacer (rsemailagents__varReqTown, " '", " ''") et "'" \t \t UNION ALL" \t \t SELECT ContentID " \t \t DE VWTenantPropertiesResults" \t \t [...] – doubleplusgood

+0

Si vos emails sont contenus dans 'VWTenantPropertiesResults', vous pouvez juste' SELECT DISTINCT CustomerEmail' dans votre requête. Pourriez-vous s'il vous plaît poster votre mise en page de table? – Quassnoi

+0

J'ai posté la vue ci-dessus qui est utilisée pour obtenir les résultats. J'ai essayé d'utiliser SELECT DISTINCT CustomerEmail mais j'ai eu l'erreur suivante; Fournisseur Microsoft OLE DB pour l'erreur SQL Server '80040e14' Syntaxe incorrecte près du mot clé 'SELECT'. ligne 541 – doubleplusgood

0

Ok ...

Essayez de créer un sous-requête qui regroupera toutes les propriétés ensemble dans une seule ligne.

Vous pouvez le faire en créant un groupe par requête comme ceci:

select 
    contentID , count(*) hits 
from 
    VWTenantPropertiesResults 
where 
    propertyValue in ('A','B','C') 
group by 
    contentID 

, vous êtes également vulnérables aux attaques par injection SQL, puisque vous créez votre SQL sans échapper correctement, il. Considérez une requête paramétrée ici, ou une procédure stockée.

Vous avez également une manière très complexe de créer votre requête. Vous construisez une chaîne en 10 étapes et l'assignez à la propriété. Pensez à utiliser un stringbuilder ici, car les chaînes sont immuables et cela peut causer des problèmes de performance (en particulier si quelque chose comme ça est utilisé dans une boucle ... Si vous avez besoin de plus de 5 concaténs, alors pensez à utiliser le stringbuilder)

0

La sous-requête que vous avez alias 'q' a un seul champ, ContentID. Sauf si vous avez des conventions de nommage très étranges, ce n'est pas une adresse e-mail. Ainsi, vous lui dites "Sélectionnez CustomerEmail From (objet de type tableau qui n'a pas de champ appelé CustomerEmail)". Cela ne peut pas fonctionner, et je suis surpris qu'il renvoie autre chose qu'un message d'erreur. Essayez la clause 'IN' ou la clause 'EXISTS'.