我有一个包含“事件”的mysql表,其中包含“类别”和“访问过的”列。一个事件可以归入三个类别。“已访问”统计事件页面被访问的次数。我想从3个类别的每个前两个访问事件。
下面是一个示例表
id :访问过的所有类别的网站。
32%-1%*23
33%-2%*12
34%-3%*42*
35%-1%*53*
36%-2%*24
37%-3%*84*
38%-1%*12
39%-2%*75*
40%-3%*22*22
我需要按以下顺序显示这些行(id=):35、32、39、36、37、34。我的代码从每个类别中只返回1行,并且我认为严格限制为返回1行(不是我写的。):
$categories=mysql_query("select distinct category from events");
while($row_cat=mysql_fetch_array($categories)){
$row=mysql_fetch_array(mysql_query("select * from events where category='".$row_cat['category']."' order by visited desc"));
echo $row['id'].", ";
}代码显示: 35,39,37,
我觉得答案似乎很简单,但我仍然莫名其妙。首先,谢谢你的帮助。
发布于 2012-03-27 19:21:15
关于
SELECT category, GROUP_CONCAT(id ORDER BY visited DESC)
FROM events
GROUP BY category对于您的原始代码:这是因为您只要求一行。
您的while循环遍历所有类别。对每一个人来说。它发出一个查询并请求一行。你需要2个嵌套的循环来查询所有的东西。所以“纯MySQL”解决方案要好得多。
但是如果你需要比你最初声明的更多的东西,你可能更好地通过在PHP端嵌套循环来真正地逐个执行这些查询:
$categories=mysql_query("select distinct category from events");
while($row_cat=mysql_fetch_array($categories)){
$inner_res=mysql_query("select * from events where category='".mysql_real_escape_string($row_cat['category'])."' order by visited desc");
while($inner_row=mysql_fetch_array($inner_res)){
echo $inner_row['id'].", ";
}
}发布于 2012-03-27 19:36:56
@glglgl方法真的很酷+1,你也可以使用find in set函数来改进它,并逐行获取每个类别的前3个事件:
select e0.*
from
events e0
inner join
(SELECT category,
GROUP_CONCAT(id ORDER BY visited DESC) as events
FROM events
GROUP BY category) C
on
e0.category = c.category and
find_in_set( e0.event, c.events ) < 3要小心,如果你有很多事件,这可能会运行很慢。
免责声明:未经测试。
发布于 2012-03-27 20:22:17
SELECT e.*
FROM
( SELECT DISTINCT category
FROM events
) AS ed
JOIN
events AS e
ON e.category = ed.category
AND e.visited >=
( SELECT visited
FROM events AS ei
WHERE ei.category = ed.category
ORDER BY visited DESC
LIMIT 1 OFFSET 1
)https://stackoverflow.com/questions/9888407
复制相似问题