好的,所以我有这个代码,它工作正常,但我非常肯定,你们可以使没有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
答案 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