2013-04-21 76 views
0

这里是我的问题: 我有这些表:如何在sql中使用order by和group?

felado fogado fehide fohide datum olvasott tartalom 

felado =发件人,fogado =接收器,

我想获得的所有地方felado或fogado是我和组线路。所以,如果有下一个线

sender 1 receiver 2 id 1 
sender 1 receiver 2 id 2 
sender 1 receiver 2 id 3 
sender 2 receiver 1 id 4 

我只是想获得一个从这些线,最后通过ID。

现在,我想是这样的:

SELECT * 
FROM belso_levelezes 
WHERE (felado="'.$_SESSION["userData"]["id"].'" 
    or fogado="'.$_SESSION["userData"]["id"].'") 
ORDER BY id DESC 
GROUP BY felado, fogado 

这gaves我只是一个从所有,但不是最后一个记录。我怎样才能得到每组的最后记录? 我想只有这个:

sender 2 receiver 1 id 4 
+0

可我实际上只得到该行?或者我必须使用其他解决方案? – user2301881 2013-04-21 12:49:30

+0

永远不要在sql查询中使用外部数据(如$ _SESSION)。互联网上的每个人都可以操纵你的数据库,它被称为sql-injection。请参阅http://php.net/manual/en/security.database.sql-injection.php – Meier 2013-04-21 12:56:54

+0

您正在使用哪些DBMS? Postgres的?甲骨文? – 2013-04-21 13:27:33

回答

1

你可以使用子查询来创建两列是每个对话是唯一的。然后,您可以在这些列上进行分组,并获取对话的最大ID。这个例子假设你的用户ID是42:

SELECT sr1 
,  sr2 
,  max(id) 
FROM (
     SELECT case when Sender < Receiver then Sender else Receiver end as sr1 
     ,  case when Sender > Receiver then Sender else Receiver end as sr2 
     ,  id 
     FROM YourTable 
     WHERE 42 in (Sender, Receiver) 
     ) as SubQueryAlias 
GROUP BY 
     sr1 
,  sr2 
+0

差不多就是这样。它给了我最后发件人或收件人是我的地方。但是,还有更多的联系人?我的意思是如果我是5号线的发送者,但有3个接收者。比我需要3线。或者,如果有5行我是接收者,但不是同一个发送者,那么比我需要5行获得。我很抱歉,我的英语有点差...这就是为什么我尝试群组.. – user2301881 2013-04-21 13:18:00

+0

更新了答案,以防您正在寻找每个对话的最后一个ID – Andomar 2013-04-21 13:34:13

+0

sr1,sr2是什么意思? – user2301881 2013-04-21 13:44:51

0
'SELECT MAX(id),felado,fegado,... FROM belso_levelezes WHERE (felado="'.$_SESSION["userData"]["id"].'" or fogado="'.$_SESSION["userData"]["id"].'") GROUP BY felado, fogado ' 
+0

我不能在排序后使用分组。我知道我首先尝试了它,但它给了我SQL的语法错误。 – user2301881 2013-04-21 13:22:55

+0

没有'order by'的情况如何 – Amir 2013-04-21 13:26:28