SQL - 按顺序排序 - 分组依据 - 不同

时间:2016-12-06 20:43:39

标签: php mysql sql

好的,所以我有这个代码,它工作正常,但我非常肯定,你们可以使没有while循环,只有一个简单的查询更好!我尝试使用ORDER BY日期和GROUP BY用户ID,但我总是得到错误的日期。你能为我们解决这个问题。

这就是我所拥有的:

$abfrage1 = "SELECT DISTINCT userid FROM updates WHERE city='Berlin'";
$ergebnis1 = mysql_query($abfrage1);

if($ergebnis1 == TRUE)
{
    $menge1 = mysql_num_rows($ergebnis1);
    if($menge1 != 0)
    {
        while($row1=mysql_fetch_object($ergebnis1))
        {
            $abfrage2 = "SELECT * FROM updates WHERE userid='$row1->userid' ORDER BY date DESC LIMIT 1";
            $ergebnis2 = mysql_query($abfrage2);

            if($ergebnis2 == TRUE)
            {
                $menge2 = mysql_num_rows($ergebnis2);
                if($menge2 != 0)
                {
                    $row2=mysql_fetch_object($ergebnis2);

                    echo "$row2->id - $row2->userid - $row2->text - $row2->date<br>";
                }
            }           
        }       
    }
}
我正在寻找类似的东西,但正如我所说,总是错误的日期:

SELECT * FROM updates WHERE city='Berlin' GROUP BY userid ORDER BY date

SELECT * FROM (SELECT * FROM updates WHERE city='Berlin' ORDER BY date DESC) as temp_info GROUP BY userid

编辑: 好 !所以我想从所有用户那里获得最后一个活动,但只有最后一个活动。 限制1用户,但无限用户。所以我首先通过ORDER BY日期来获取该用户的最后一个活动,而不是我想要DISTINCT用户(OR GROUP BY),所以我每个用户只得到一个结果。 所以我尝试了Order by - Group by - Distinct但是我总是得到错误的日期,所以错误的活动。似乎GROUP BY杀死了ORDER BY,即使我尝试使用子查询。 似乎GROUP BY忽略了ORDER BY日期DESC。 所以我得到每个用户一个活动,但它不是最后一个。 GROUP BY userid只是从第一个ORDER BY日期开始独立地获取该用户的第一个条目(id)。

id  userid      date        text
01  01      2015-04-14      bla
02  01      2015-04-15      bla
03  02      2015-04-16      bla
04  01      2015-04-17      bla
05  02      2015-04-18      bla
06  02      2015-04-19      bla
07  02      2015-04-20      bla
08  03      2015-04-21      bla
09  01      2015-04-22      bla
10  01      2015-04-23      bla

What i want:
10  01      2015-04-23      bla
08  03      2015-04-21      bla
07  02      2015-04-20      bla

But this is what i get:
01  01      2015-04-14      bla
03  02      2015-04-16      bla
08  03      2015-04-21      bla

我尝试了ORDER BY date和ORDER BY id,但GROUP BY userid自己做了。

感谢您的帮助!我的最终解决方案:

SELECT u1.* FROM updates u1 JOIN
(SELECT MAX(id) as tempid, userid FROM updates WHERE city='Berlin' GROUP BY userid)
u2 ON u1.id = u2.tempid ORDER BY u1.datum DESC

1 个答案:

答案 0 :(得分:1)

使用派生表获取每个用户的最新活动的ID和日期。 JOIN这会返回到您的更新表,以获取与该活动相关的行。

SELECT u1.*
FROM updates u1
JOIN (SELECT MAX(id) AS id , userid, MAX(date) as date FROM Updates GROUP BY userid) u2
  ON u1.id = u2.id and u1.date = u2.date

这是基于您的示例的假设,但从技术上讲,每个用户的最大id与获取最新活动相同吗?如果是这样,您可以稍微缩短代码并删除MAX(date)件。

SELECT u1.*
FROM updates u1
JOIN (SELECT MAX(id) as id, userid FROM Updates GROUP BY userid) u2
  ON u1.id = u2.id