Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 - Fatal编程技术网

Mysql 如何选择一组每行中都有分区名称的行?

Mysql 如何选择一组每行中都有分区名称的行?,mysql,Mysql,我有一个带有范围分区的MySQL表。在PostgreSQL中,我可以选择tableoid列来查看每行所在的分区(因为在PostgreSQL中,我必须显式地使用表继承来实现分区)。在MySQL中有类似的方法吗?下面是我大致想要的(假设我使用范围分区对orders表进行了年度分区): 结果将是: +-----------------+-----------------------+ | orders.cost_usd | orders.partition_name | +--------------

我有一个带有范围分区的MySQL表。在PostgreSQL中,我可以选择
tableoid
列来查看每行所在的分区(因为在PostgreSQL中,我必须显式地使用表继承来实现分区)。在MySQL中有类似的方法吗?下面是我大致想要的(假设我使用范围分区对
orders
表进行了年度分区):

结果将是:

+-----------------+-----------------------+
| orders.cost_usd | orders.partition_name |
+-----------------+-----------------------+
|         1039.90 | p_2005                |
|          459.06 | p_2006                |
|          033.77 | p_2006                |
|         6473.36 | p_2008                |
|          240.17 | p_2009                |
|         1011.20 | p_2013                |
+-----------------+-----------------------+
简介 为了解决这个问题,您可以使用
信息\u SCHEMA.PARTITIONS
表。 对您特别有用的是
PARTITION\u DESCRIPTION
PARTITION\u NAME
字段

发件人:

分区描述:此列用于范围和列表 分区。对于范围分区,它包含在 分区的值小于子句,可以是整数或 最大值。对于列表分区,此列包含值 在分区的VALUES in子句中定义,该子句是 以逗号分隔的整数值列表

对于分区方法不是范围或列表的分区, 此列始终为空

最后,非常重要的是,确切的SQL解决方案还取决于所使用的分区类型。请参阅

按范围划分 示例:

SQL:

SELECT DISTINCT orders.cost_usd, PartitionInfo2.PARTITION_NAME
FROM orders,    
  ( SELECT orders.year,
           min(CONVERT(p.PARTITION_DESCRIPTION,UNSIGNED INTEGER)) AS rangeMax
   FROM orders,
        INFORMATION_SCHEMA.PARTITIONS p
   WHERE orders.year < CONVERT(p.PARTITION_DESCRIPTION,UNSIGNED INTEGER)
     AND TABLE_NAME='orders'
   GROUP BY orders.year) AS PartitionInfo,
   INFORMATION_SCHEMA.PARTITIONS PartitionInfo2
WHERE orders.year = PartitionInfo.year AND
CONVERT(PartitionInfo2.PARTITION_DESCRIPTION,UNSIGNED INTEGER) = 
PartitionInfo.RangeMax;
COST_USD    PARTITION_NAME
1039.9      p_2005
459.06      p_2006
33.77       p_2006
6473.36     p_2008
240.17      p_2009
1011.2      p_2013
select cost_usd, p.PARTITION_NAME, concat('p_',orders.year) PRETTY_PNAME
from INFORMATION_SCHEMA.PARTITIONS p,
orders where
TABLE_NAME='orders' AND
PARTITION_ORDINAL_POSITION+1999 = orders.year;
COST_USD    PARTITION_NAME  PRETTY_PNAME
1039.9         p5        p_2005
459.06         p6        p_2006
33.77          p6        p_2006
6473.36        p8        p_2008
240.17         p9        p_2009
1011.2         p13       p_2013
哈希分区 示例:

下面是一个通过散列进行分区的示例,但是另外,我们从年份整数中减去2000,以便分区索引从零开始

create table orders
(cost_usd double,
 year int
 )
 PARTITION BY HASH(year-2000) PARTITIONS 20;
从本质上说,这意味着我们将有20个分区,这些分区将正确地适应2000年到2020年的时间。不幸的是,较大的值将位于两者之间

像上面这样的设置会导致更简单的解决方案

SQL:

SELECT DISTINCT orders.cost_usd, PartitionInfo2.PARTITION_NAME
FROM orders,    
  ( SELECT orders.year,
           min(CONVERT(p.PARTITION_DESCRIPTION,UNSIGNED INTEGER)) AS rangeMax
   FROM orders,
        INFORMATION_SCHEMA.PARTITIONS p
   WHERE orders.year < CONVERT(p.PARTITION_DESCRIPTION,UNSIGNED INTEGER)
     AND TABLE_NAME='orders'
   GROUP BY orders.year) AS PartitionInfo,
   INFORMATION_SCHEMA.PARTITIONS PartitionInfo2
WHERE orders.year = PartitionInfo.year AND
CONVERT(PartitionInfo2.PARTITION_DESCRIPTION,UNSIGNED INTEGER) = 
PartitionInfo.RangeMax;
COST_USD    PARTITION_NAME
1039.9      p_2005
459.06      p_2006
33.77       p_2006
6473.36     p_2008
240.17      p_2009
1011.2      p_2013
select cost_usd, p.PARTITION_NAME, concat('p_',orders.year) PRETTY_PNAME
from INFORMATION_SCHEMA.PARTITIONS p,
orders where
TABLE_NAME='orders' AND
PARTITION_ORDINAL_POSITION+1999 = orders.year;
COST_USD    PARTITION_NAME  PRETTY_PNAME
1039.9         p5        p_2005
459.06         p6        p_2006
33.77          p6        p_2006
6473.36        p8        p_2008
240.17         p9        p_2009
1011.2         p13       p_2013
结果:

SELECT DISTINCT orders.cost_usd, PartitionInfo2.PARTITION_NAME
FROM orders,    
  ( SELECT orders.year,
           min(CONVERT(p.PARTITION_DESCRIPTION,UNSIGNED INTEGER)) AS rangeMax
   FROM orders,
        INFORMATION_SCHEMA.PARTITIONS p
   WHERE orders.year < CONVERT(p.PARTITION_DESCRIPTION,UNSIGNED INTEGER)
     AND TABLE_NAME='orders'
   GROUP BY orders.year) AS PartitionInfo,
   INFORMATION_SCHEMA.PARTITIONS PartitionInfo2
WHERE orders.year = PartitionInfo.year AND
CONVERT(PartitionInfo2.PARTITION_DESCRIPTION,UNSIGNED INTEGER) = 
PartitionInfo.RangeMax;
COST_USD    PARTITION_NAME
1039.9      p_2005
459.06      p_2006
33.77       p_2006
6473.36     p_2008
240.17      p_2009
1011.2      p_2013
select cost_usd, p.PARTITION_NAME, concat('p_',orders.year) PRETTY_PNAME
from INFORMATION_SCHEMA.PARTITIONS p,
orders where
TABLE_NAME='orders' AND
PARTITION_ORDINAL_POSITION+1999 = orders.year;
COST_USD    PARTITION_NAME  PRETTY_PNAME
1039.9         p5        p_2005
459.06         p6        p_2006
33.77          p6        p_2006
6473.36        p8        p_2008
240.17         p9        p_2009
1011.2         p13       p_2013

您使用了什么类型的分区?这会影响答案。。范围,线性键???我们需要查看您的
分区BY
语句。