理想的には、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を参照してください。
「0 AS price_index」price_index列には何を表示しますか?彼らはあなたの2番目のテーブルからどこに現れますか? – HoTTab1CH
@ HoTTab1CHこれらは 'product.supplier_catalog_number 'ごとに自動増分インデックスです – Bohdan