MySQL中是否有一个允许类似于此的变量组号和限制的查询
我已经检查了一些stackoverflow问题,还有一些类似的问题,但我没有完全注意到这一点 如果您有这样一张桌子:MySQL中是否有一个允许类似于此的变量组号和限制的查询,mysql,group-by,Mysql,Group By,我已经检查了一些stackoverflow问题,还有一些类似的问题,但我没有完全注意到这一点 如果您有这样一张桌子: uid cat_uid itm_uid 1 1 4 2 1 5 3 2 6 4 2 7 5 3 8 6 3 9 其中,自动递增的uid列和cat uid引用 要筛选
uid cat_uid itm_uid
1 1 4
2 1 5
3 2 6
4 2 7
5 3 8
6 3 9
其中,自动递增的uid列和cat uid引用
要筛选的相关类别和itm_uid值是其中之一
我们正在寻找
我想获得一个包含以下示例结果的结果集:
array (
0 => array (1 => array(4,5)),
1 => array (2 => array(6,7)),
2 => array (3 => array(8,9))
)
一个示例问题是-从每个类别中选择2条记录(不管可能有多少类别),并确保它们是uid在这些类别中的最后2条条目
我不知道如何构造问题以允许回答,欢迎提供任何关于解决方法的提示
编辑:
这不是一个非常明确的问题,所以让我将场景扩展到更具体的内容
我有一组记录被输入到类别中,我希望通过尽可能少的查询来选择每个类别输入的最新2条记录,这样当我列出这些类别的内容时,每个类别至少有2条记录(假设数据库中已经有2条或更多条记录)。一个类似的查询选择了最后100条记录并将它们过滤到类别中,但对于少数类别,其中一些更新速度比其他类别快,可能会导致前100条记录不是由每个类别的成员组成,因此为了解决这一问题,我正在寻找一种方法,从每个类别中选择2条记录(或N个记录,假设每个类别相同)并且这两个记录是最后输入的。日期字段可用于排序,但itm_uid本身可用于指示插入的顺序
SELECT cat_uid, itm_uid,
IF( @cat = cat_uid, @cat_row := @cat_row + 1, @cat_row := 0 ) AS cat_row,
@cat := cat_uid
FROM my_table
JOIN (SELECT @cat_row := 0, @cat := 0) AS init
HAVING cat_row < 2
ORDER BY cat_uid, uid DESC
现在,如果我们只保留具有cat_row<2
的行,我们将得到我们想要的结果:
---------------------------------------
| uid | cat_uid | itm_uid | cat_row |
| 45 | 4 | 34 | 0 |
| 33 | 4 | 54 | 1 |
| 56 | 6 | 11 | 0 |
| 20 | 6 | 64 | 1 |
| ... | ... | ... | ... |
---------------------------------------
现在,如果我们只保留具有cat_row<2
的行,我们将得到我们想要的结果:
---------------------------------------
| uid | cat_uid | itm_uid | cat_row |
| 45 | 4 | 34 | 0 |
| 33 | 4 | 54 | 1 |
| 56 | 6 | 11 | 0 |
| 20 | 6 | 64 | 1 |
| ... | ... | ... | ... |
---------------------------------------
这称为邻接树模型或父子树模型。这是一种更简单的树模型,其中只有一个指针或一个叶子。您可以使用递归或自连接来解决查询。遗憾的是,MySQL不支持递归查询,可能它使用的是预处理语句。我想建议您使用自连接。使用自联接您可以使用特殊条件从右侧和左侧获取所有行
select t1.cat_uid, t2.cat_uid, t1.itm_uid, t2.itm_uid From t1 Inner Join t2 On t1.cat_uid = t2.cat_uid
这称为邻接树模型或父子树模型。这是一种更简单的树模型,其中只有一个指针或一个叶子。您可以使用递归或自连接来解决查询。遗憾的是,MySQL不支持递归查询,可能它使用的是预处理语句。我想建议您使用自连接。使用自联接您可以使用特殊条件从右侧和左侧获取所有行
select t1.cat_uid, t2.cat_uid, t1.itm_uid, t2.itm_uid From t1 Inner Join t2 On t1.cat_uid = t2.cat_uid
您实际想要做什么还不太清楚,但是可以看看MySQL
GROUP\u CONCAT()
函数。我用一个场景扩展了我最初的问题。您实际想要做什么还不太清楚,但是可以看看MySQLGROUP\u CONCAT()
函数。我用一个场景扩展了我的初始问题。你能解释一下@符号和thr:=-符号吗?为什么让cat_行<2?@Jitamaro@cat_行
是一个变量,:=
是给变量赋值的操作符,cat_行<2
,因为你想“从每个类别中选择2条记录”.@Jitamaro为什么要这么麻烦?因为没有“每个群体的限制”这样的东西在MySql中。谢谢你,我建议一个更简单的解决方案。你的解决方案提供了OP问题的精确副本吗?是的,这很麻烦,我不明白。你能解释一下@符号和thr:=-符号吗?为什么让cat_行<2?@Jitamaro@cat_行
是一个变量,:=
是给变量赋值的操作符,cat_行<2代码>因为你想“从每个类别中选择2条记录”。@Jitamaro为什么会有这样的麻烦?因为没有“每个组的限制”这样的东西在MySql中。谢谢你,我建议一个更简单的解决方案。你的解决方案提供了OP问题的精确副本吗?是的,这很麻烦,我不明白。嗨,Jitamaro,我不确定你会如何限制这里的集合,你能在此基础上展开吗?谢谢你尝试这一个-我认为它需要一种类似于上面的方法-也许是wiki on operator use with examples将有助于提升mysql资源的透明度:没问题,我不熟悉复杂的SQL脚本,它看起来不太方便用户。嗨,Jitamaro,我不确定你会如何限制这里的集合,你能扩展一下吗?谢谢你尝试这个-我认为这需要一种方法上面的e行-也许一个关于操作员使用示例的wiki将有助于提升mysql资源,这不是非常透明:没问题,我不熟悉复杂的SQL脚本,它看起来不太友好。