首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从distinct <column>中选择多行

从distinct <column>中选择多行
EN

Stack Overflow用户
提问于 2012-03-27 19:07:43
回答 3查看 1K关注 0票数 1

我有一个包含“事件”的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行(不是我写的。):

代码语言:javascript
复制
$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,

我觉得答案似乎很简单,但我仍然莫名其妙。首先,谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-27 19:21:15

关于

代码语言:javascript
复制
SELECT category, GROUP_CONCAT(id ORDER BY visited DESC)
    FROM events
    GROUP BY category

对于您的原始代码:这是因为您只要求一行。

您的while循环遍历所有类别。对每一个人来说。它发出一个查询并请求一行。你需要2个嵌套的循环来查询所有的东西。所以“纯MySQL”解决方案要好得多。

但是如果你需要比你最初声明的更多的东西,你可能更好地通过在PHP端嵌套循环来真正地逐个执行这些查询:

代码语言:javascript
复制
$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'].", ";
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-03-27 19:36:56

@glglgl方法真的很酷+1,你也可以使用find in set函数来改进它,并逐行获取每个类别的前3个事件:

代码语言:javascript
复制
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

要小心,如果你有很多事件,这可能会运行很慢。

免责声明:未经测试。

票数 1
EN

Stack Overflow用户

发布于 2012-03-27 20:22:17

代码语言:javascript
复制
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
                )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9888407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档