【问题标题】:MySQL Select top 10 items for each category [duplicate]MySQL为每个类别选择前10个项目[重复]
【发布时间】:2017-07-13 06:17:09
【问题描述】:

您好,我有一个 mysql 数据库,其中有多个类别。例如,我希望能够仅提取每个类别的前 10 个项目:

我有下表,我想为 name = a 提取前 2 行,name = b 和 name = c 相同

-----------------------------------
name | value | description | logo
-----------------------------------
a    | 2.00  | its a letter| image
-----------------------------------
a    | 5.00  | its a letter| image
-----------------------------------
b    | 6.00  | its a letter| image
-----------------------------------
c    | 3.00  | its a letter| image
-----------------------------------
c    | 1.00  | its a letter| image
------------------------------------

这就是我所拥有的,所以农场后过滤器是调用时传入的一串对象。不幸的是,它只给了我所有东西的前 10 个,如果你能指出我正确的方向,那就太好了,谢谢!

代码:

SELECT * 
FROM object_list 
Where object IN (".$_POST['filter'].") 
ORDER BY date DESC, object ASC,id DESC

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您可以通过以下查询获取组以及元素count

    SELECT name, value, 
    @count := IF(@value = name, @count + 1, 1) AS count,
    @value := name AS some_value
    FROM test, (SELECT @count := 1, @value := NULL) a
    WHERE test.name in ('a', 'b')
    

    现在,如果您需要将每组的行数限制为 2,那么您只需将此查询包装到另一个选择中并添加一个条件,例如:

    SELECT * 
    FROM (
      SELECT name, value, 
      @count := IF(@value = name, @count + 1, 1) AS count,
      @value := name AS some_value
      FROM test, (SELECT @count := 1, @value := NULL) a
      WHERE test.name in ('a', 'b')) a
    WHERE a.count <= 2;
    

    这里是 SQL Fiddle

    【讨论】:

    • 感谢您的评论,我在最后进行了测试,几乎效果很好,我发现如果列表不按顺序排列,您可以说 8 个名字,后者分散在表,您将获得 2 个 a 的组。
    • 是的,我们需要为此添加order by。但是,我没有找到任何列,因此没有包括在内。此外,MySQL 没有默认排序顺序,因此您需要有一列可以order by
    • 太棒了,谢谢!然而,它的信息拉动是为 a 和 b 拉动多组 2,无论如何只能拉动 2 个?
    【解决方案2】:

    这行得通吗?

    SELECT 
        yourtable.* 
    FROM 
        yourtable 
        JOIN (
            SELECT 
                t1.name, 
                t1.value, 
                COUNT(t2.name) AS theCount 
            FROM yourtable t1 
            LEFT JOIN yourtable t2 ON t1.name = t2.name AND t1.value > t2.value 
            WHERE t1.name in ('a', 'b')
            GROUP BY t1.name, t1.value 
            HAVING theCount < 2
        ) AS dt USING (name, value);
    

    来源:http://thenoyes.com/littlenoise/?p=36

    【讨论】:

    • 感谢您的回复!我试过你的代码,但我不确定我可以在哪里指定我想要的例如名称 a 和 b?
    • 试试我的编辑;如果没有测试数据,我无法确定它会起作用。
    • 再次感谢您的帮助,它几乎在那里我能够得到一些结果不幸的是它似乎没有拉我正在寻找的东西,它似乎是从列表的顶部拉出来的有什么办法让它从底部拉出来?
    • t1.value &gt; t2.value 更改为t1.value &lt; t2.value
    • 效果很好!感谢您的所有帮助!
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多