2009-08-18 84 views
2

我正在编写一个项目的Facebook类请求页。我坚持在所有请求打印页面中对请求进行分组。group by clause help

我的SQL作为

SQL = "SELECT R.REQUESTID, R.BYID, R.TOID, R.TYPE, R.DATEENTERED, M.MEMBERID, M.FIRSTNAME, M.LASTNAME" 
SQL = SQL & " FROM REQUESTS R, MEMBERS M" 
SQL = SQL & " WHERE R.ACTIVE = 1 AND R.TOID = "& Session("MEMBERID") &" AND R.BYID = M.MEMBERID" 
SQL = SQL & " GROUP BY R.REQUESTID, R.BYID, R.TOID, R.TYPE, R.DATEENTERED, M.MEMBERID, M.FIRSTNAME, M.LASTNAME" 
SQL = SQL & " ORDER BY R.DATEENTERED DESC" 

返回我的结果
朋友
伊迪
朋友
弗兰克
集团
乔治

但我需要它作为

朋友
伊迪
弗兰克
集团
乔治

+3

伙计,请检查这些问题http://stackoverflow.com/search?q=avoid+SQL+injection – 2009-08-18 18:24:50

+1

SQL注入不适用于此,除非未清理的用户数据在MEMBERID会话变量中。其中你没有任何信息。 – Kieveli 2009-08-18 18:28:01

+0

+1到counter -1。当然这是动态sql,但在这段代码片段中似乎没有任何SQL注入风险。没有用户输入的数据,只是一个会话变量,可能是从登录中获取的pkey标识符。 – 2009-08-18 18:29:50

回答

0

如果您要求的会员之一有多个请求,您将获得重复。

看看这个:

SELECT --select all columns required, can produce duplicates 
    R.REQUESTID, R.BYID, R.TOID, R.TYPE, R.DATEENTERED, M.MEMBERID, M.FIRSTNAME, M.LASTNAME 
    FROM REQUESTS   R 
     INNER JOIN MEMBERS M ON R.BYID = M.MEMBERID 
    WHERE M.MEMBERID IN (SELECT --get distinct list of members to display 
          M.MEMBERID 
          FROM REQUESTS   R 
           INNER JOIN MEMBERS M ON R.BYID = M.MEMBERID 
          WHERE R.ACTIVE = 1 AND R.TOID = ___MEMBERID__ 
          GROUP BY M.MEMBERID 
         ) 
    ORDER BY R.DATEENTERED DESC 
+0

我想我需要使用连接,但我认为我需要再次请求连接请求表。 – Efe 2009-08-18 18:48:24

+0

派生表获取成员的不同列表,然后再回到请求中,尝试获取要显示的其他列,这会引入重复项。将结果列仅限于您所需的内容。如果您需要所有这些列,那么您必须与重复项目一起生活。 – 2009-08-18 18:55:24

0

分组通过将会给您通过您的分组列中唯一值。

为什么要将Friend行列出两次?

+0

那就是事情。我不希望它列出两次,但目前它是。 – Efe 2009-08-18 18:39:54

0

有一些在你的SELECT字段和GROUP BY子句其中,从他们的名字,听起来如MEMBERID或可能是场无论是主键值很独特的,如DATEENTERED(最后一个可能包含时间信息)。这些字段中的任何一个都可能阻止您的查询进行任何类型的分组。我会尝试删除一些这些项目,直到您的分组开始生效。这样你就可以隔离哪些字段有问题。或者,保留一些字段,例如名字和姓氏,然后添加以查看GROUP BY分解的位置。

0

我刚在查询的顶部添加了一个DISTINCT。如果我说得对,我猜这会解决。

SQL = “SELECT DISTINCT R.REQUESTID,R.BYID,R.TOID,R.TYPE,R.DATEENTERED,M.MEMBERID,M.FIRSTNAME,M.LASTNAME”

SQL = SQL &“通过请求R,MEMBERS M”

SQL = SQL & “WHERE R.ACTIVE = 1 AND R.TOID =” &会话( “MEMBERID”)& “AND R.BYID = M.MEMBERID”

SQL = SQL &“GROUP BY R.REQUESTID,R.BYID,R.TOID,R.TYPE,R.DATEENTERED,M.MEMBERID,M.FIRSTNAME,M.LA STNAME”

SQL = SQL & “ORDER BY R.DATEENTERED DESC”

试试这个,如果作品投票吧!

+1

我试过了,它不会工作。 – Efe 2009-08-18 18:36:06

2

尝试将其更改为不同的选择。我认为这是特定供应商,但通常

SQL = "SELECT DISTINCT R.REQUESTID, R.BYID, R.TOID, R.TYPE, R.DATEENTERED, M.MEMBERID, M.FIRSTNAME, M.LASTNAME" 

SQL = "SELECT DISTINCT ROW R.REQUESTID, R.BYID, R.TOID, R.TYPE, R.DATEENTERED, M.MEMBERID, M.FIRSTNAME, M.LASTNAME" 

会做的伎俩。

+0

如果每个MEMBERS有多个REQUESTS行,则不同的是不太可能删除重复项。如果REQUESTS.DATEENTERED是diffeent,或者REQUESTS.REQUESTID是唯一的ID,那么独特的方式将无法工作。 – 2009-08-18 18:41:29

+0

其惊人的,这个答案是错误的,但它得到20分,而我的正确(和选定)的答案只有15! – 2009-08-19 11:43:29

+0

我的头像包含催眠建议。 ;) – Kieveli 2009-08-19 18:47:37