Php MySQL为每个类别选择前10项
你好,我有一个mysql数据库,其中有多个类别。我希望每个类别只能提取前10个项目,例如: 我有下表,我想拉取name=a的前两行,name=b和name=c的前两行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 -------------------------
-----------------------------------
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.value
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;