Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中是否有一个允许类似于此的变量组号和限制的查询_Mysql_Group By - Fatal编程技术网

MySQL中是否有一个允许类似于此的变量组号和限制的查询

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引用 要筛选

我已经检查了一些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引用 要筛选的相关类别和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()
函数。我用一个场景扩展了我最初的问题。您实际想要做什么还不太清楚,但是可以看看MySQL
GROUP\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脚本,它看起来不太友好。