Php MySQL为每个类别选择前10项

Php MySQL为每个类别选择前10项,php,mysql,Php,Mysql,你好,我有一个mysql数据库,其中有多个类别。我希望每个类别只能提取前10个项目,例如: 我有下表,我想拉取name=a的前两行,name=b和name=c的前两行 ----------------------------------- name | value | description | logo ----------------------------------- a | 2.00 | its a letter| image -------------------------

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

我有下表,我想拉取name=a的前两行,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
------------------------------------
这就是我所拥有的,所以farm post filter是一个在调用时传入的对象字符串。不幸的是,它只给了我所有东西中的前10个,如果你能给我指出正确的方向,那就太好了,谢谢你

代码:

这行吗

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

来源:

您可以通过以下查询获得组和元素计数:

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并添加条件,例如:

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;

以下是。

谢谢你的评论,我在我这边进行了测试,几乎效果很好,我发现如果列表不符合顺序,你可以说8个名字,后面一个摊开在桌子上,你会得到2个a的组。是的,我们需要为此添加order by。然而,我没有找到任何专栏,因此,没有包括。此外,MySQL没有默认的排序顺序,所以您需要有一个列,您可以在上进行排序。太棒了,谢谢!它拉取信息,但是拉取a和b的多个2组,是否仍然只让它拉取每个2组?感谢您的回复!我尝试了你的代码,但我不确定在哪里可以指定我想要的,例如名称a和b?请尝试编辑;如果没有测试数据,我不能确定它是否会工作。再次感谢您的帮助,我几乎可以得到一些结果。不幸的是,它似乎不是我要找的,它似乎是从列表的顶部开始的。有没有办法让它从底部开始呢?将t1.value>t2.value更改为t1.valueSELECT * 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;