Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从distinct_Mysql - Fatal编程技术网

Mysql 从distinct

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

我有一个mysql的“事件”表,其中包含“category”和“visted”列。一项活动可分为三类“已访问”统计事件页面的访问次数。我想从三个类别中的每一个中选出两个访问量最高的活动

下面是一个示例表

已访问的id类别 32123 33212 34342 35153 36224 37384 38112 39275 40322

我需要按以下顺序显示这些行id=:35、32、39、36、37、34。我的代码只返回每个类别中的一行,我相信严格限制为返回我没有编写的一行

$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
                )