Mysql 从distinct
我有一个mysql的“事件”表,其中包含“category”和“visted”列。一项活动可分为三类“已访问”统计事件页面的访问次数。我想从三个类别中的每一个中选出两个访问量最高的活动 下面是一个示例表 已访问的id类别 32123 33212 34342 35153 36224 37384 38112 39275 40322 我需要按以下顺序显示这些行id=:35、32、39、36、37、34。我的代码只返回每个类别中的一行,我相信严格限制为返回我没有编写的一行Mysql 从distinct,mysql,Mysql,我有一个mysql的“事件”表,其中包含“category”和“visted”列。一项活动可分为三类“已访问”统计事件页面的访问次数。我想从三个类别中的每一个中选出两个访问量最高的活动 下面是一个示例表 已访问的id类别 32123 33212 34342 35153 36224 37384 38112 39275 40322 我需要按以下顺序显示这些行id=:35、32、39、36、37、34。我的代码只返回每个类别中的一行,我相信严格限制为返回我没有编写的一行 $categories=mys
$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
我觉得答案可能非常简单,但我仍然无法回答。提前谢谢你的帮助。你呢
SELECT category, GROUP_CONCAT(id ORDER BY visited DESC)
FROM events
GROUP BY category
?
对于原始代码:这是因为您只要求一行
while循环迭代所有类别。对他们每个人来说。它发出一个查询并请求一行。您需要2个嵌套循环来查询所有内容。因此,纯MySQL的解决方案要好得多
但是,如果您需要比最初声明的更多的内容,那么您可能最好通过嵌套循环来逐个执行这些查询:
$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'].", ";
}
}
@GLGL方法真的很酷+1,您还可以使用函数对其进行细化,并按行获取每个类别的前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
要小心,如果你有很多活动,这可能会运行缓慢
免责声明:未经测试。对不起,我可能没有正确解释自己。我不需要只显示6行的ID,我需要遍历每个类别的前2个事件,这样我就可以在title和description等字段中显示值。如果愿意的话,有点像RSS提要。内部while循环似乎没有执行。编辑:derp,只有当您在适当的值(如表的名称)中重新编辑时,“复制意大利面”才起作用。谢谢,这很有效。我所要做的就是将内部循环限制为2个结果。我喜欢你的做法,但是我确实计划让这个表变得非常大,那么除了使用find_in_set之外,还有其他方法吗?
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
)