MySQL SELECT基于不同列中的值的增量索引

博丹

我做以下选择

SELECT products.supplier_catalog_number, prices.price, 0 AS price_index
FROM products
  INNER JOIN prices ON prices.product_id = products.id
LIMIT 10

结果看起来像

+-------------------------+----------+-------------+
| supplier_catalog_number | price    | price_index |
+-------------------------+----------+-------------+
| 00000001600L            | 287.0000 |           0 |
| 00000001600L            | 243.9500 |           0 |
| 0023-200                | 710.0000 |           0 |
| 0023-200                | 603.5000 |           0 |
| 0023-300                | 232.0000 |           0 |
| 0023-300                | 185.6000 |           0 |
| 0023-301                | 289.0000 |           0 |
| 0023-301                | 231.2000 |           0 |
| 0023-301                | 109.0000 |           0 |
| 0023-301                |  92.6500 |           0 |
+-------------------------+----------+-------------+

我需要结果是

+-------------------------+----------+-------------+
| supplier_catalog_number | price    | price_index |
+-------------------------+----------+-------------+
| 00000001600L            | 287.0000 |           0 |
| 00000001600L            | 243.9500 |           1 |
| 0023-200                | 710.0000 |           0 |
| 0023-200                | 603.5000 |           1 |
| 0023-300                | 232.0000 |           0 |
| 0023-300                | 185.6000 |           1 |
| 0023-301                | 289.0000 |           0 |
| 0023-301                | 231.2000 |           1 |
| 0023-301                | 109.0000 |           2 |
| 0023-301                |  92.6500 |           3 |
+-------------------------+----------+-------------+

可以在单个查询中完成吗?

小男孩

理想情况下,您可以通过12.19 Window Functions实现您需要的功能,但 MySQL 目前没有官方支持。

例如,在 MariaDB (>= 10.2.0), Window Functions 中,您可以运行如下查询:

SELECT
  `products`.`supplier_catalog_number`,
  `prices`.`price`,
  ROW_NUMBER() OVER (PARTITION BY `products`.`supplier_catalog_number`) - 1 `price_index`
FROM
  `products`
    INNER JOIN `prices` ON `prices`.`product_id` = `products`.`id`
ORDER BY
  `products`.`supplier_catalog_number`,
  `price_index`
LIMIT 10;

db<>fiddle

实现您需要的(MySQL)的一种方法是执行以下查询,但是,这不是实现它的唯一或有效方法:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.19    |
+-----------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `prices`, `products`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `products` (
    ->   `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->   `supplier_catalog_number` VARCHAR(12) NOT NULL
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `prices` (
    ->   `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->   `price` DECIMAL(9, 4) NOT NULL,
    ->   `product_id` BIGINT UNSIGNED NOT NULL,
    ->   FOREIGN KEY (`product_id`)
    ->     REFERENCES `products`(`id`)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `products`
    ->   (`supplier_catalog_number`)
    -> VALUES
    ->   ('00000001600L'),
    ->   ('0023-200'),
    ->   ('0023-300'),
    ->   ('0023-301');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `prices`
    ->   (`price`, `product_id`)
    -> VALUES
    ->   (287.0000, 1), (243.9500, 1),
    ->   (710.0000, 2), (603.5000, 2),
    ->   (232.0000, 3), (185.6000, 3),
    ->   (289.0000, 4), (231.2000, 4),
    ->   (109.0000, 4), (92.6500, 4);
Query OK, 10 rows affected (0.00 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> SELECT
    ->   `der`.`supplier_catalog_number`,
    ->   `der`.`price`,
    ->   `der`.`price_index`
    -> FROM (
    ->   SELECT
    ->     `products`.`supplier_catalog_number`,
    ->     `prices`.`price`,
    ->     (SELECT @`index` := IF(@`id` = `products`.`id`, @`index` + 1, 0)) `price_index`,
    ->     (SELECT @`id` := `products`.`id`)
    ->   FROM
    ->     (SELECT @`id` := 0, @`index` := 0) `init`,
    ->     `products`
    ->       INNER JOIN `prices` ON `prices`.`product_id` = `products`.`id`
    ->   ORDER BY
    ->     `products`.`id`,
    ->     `prices`.`price`
    ->   LIMIT 10
    -> ) `der`
    -> ORDER BY
    ->   `der`.`supplier_catalog_number`,
    ->   `der`.`price_index`;
+-------------------------+----------+-------------+
| supplier_catalog_number | price    | price_index |
+-------------------------+----------+-------------+
| 00000001600L            | 287.0000 |           0 |
| 00000001600L            | 243.9500 |           1 |
| 0023-200                | 710.0000 |           0 |
| 0023-200                | 603.5000 |           1 |
| 0023-300                | 232.0000 |           0 |
| 0023-300                | 185.6000 |           1 |
| 0023-301                | 289.0000 |           0 |
| 0023-301                | 231.2000 |           1 |
| 0023-301                | 109.0000 |           2 |
| 0023-301                |  92.6500 |           3 |
+-------------------------+----------+-------------+
10 rows in set (0.00 sec)

db-fiddle

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

mysql中基于相同ID的增量列值

来自分类Dev

MySQL更新基于其他列值的增量列

来自分类Dev

MySQL计数ID基于不同的列值

来自分类Dev

MySQL增量或不基于以前的值

来自分类Dev

基于自动增量列的ORDER MySQL分组

来自分类Dev

从MySql中的列中选择不同的值

来自分类Dev

MySQL列值使用增量ID

来自分类Dev

MySQL - 基于列的值加入?

来自分类Dev

PHP / MySQL排序时,SELECT结果中的某些行的特定列具有不同的值

来自分类Dev

MySQL,SELECT * FROM与索引列

来自分类Dev

Codeigniter, mysql, select_max ... 不同列值时插入

来自分类Dev

MySQL:基于多列PK和事务的自动增量

来自分类Dev

MySQL查询基于该列组中的值的总和

来自分类Dev

如何在mysql查询的列中打印基于条件的值

来自分类Dev

MySQL增量列

来自分类Dev

MySQL:在表的索引列中获取相邻的值行

来自分类Dev

如何使用mysql获取数组列中特定索引的值?

来自分类Dev

MySQL查询基于基于该列的列组中的值的总和

来自分类Dev

MySQL中的增量值

来自分类Dev

MySQL中不同值的总和

来自分类Dev

MySQL:将值检索到不同的列中

来自分类Dev

MySQL查询以查找列中的不同值并获取总和

来自分类Dev

MYSQL计算值在2个不同列中的次数

来自分类Dev

MySQL:将值检索到不同的列中

来自分类Dev

如何从MYSQL的一列不同值中获取计数

来自分类Dev

MySQL选择不同值的计数到单独的列中

来自分类Dev

如何根据在 MySQL 中不同的列的值组合行

来自分类Dev

基于不同列值的用户和文件名的mysql查询计数

来自分类Dev

MySQL基于列值选择查询PHP