Вычисление идентификаторов комбинаций в MySQL с последующим сохранением их на складе - PullRequest
0 голосов
/ 19 декабря 2018

Хорошо, я вытаскиваю свои волосы этим.

У меня есть таблица с именем products_bind_variant

itemId int(10)
productId int(10)
variantId int(10)

OptionId ссылается на тип, будь то размер, цвет и т. Д.

Эта таблица является вариантом

variantId int(10)
name varchar(150)
grouping varchar(150)

Значением группировки будет что-то вроде размера, цвета, диапазона и т. Д. И т. Д.

Мои варианты данных tavble находятся здесь:

|1|Small|Size
|2|Medium|Size
|3|Large|Size
|4|Red|Colour
|5|White|Colour
|6|Blue|Colour
|7|Extra Large|Size
|8|1-3 years|Range
|9|3-10|Range

Мои данные products_bind_variant находятся здесь:

|1|69|5
|7|69|6
|8|69|8
|9|69|9
|10|69|4
|12|69|1
|18|69|3
|19|69|2
|20|69|7

Я хочу запросить, чтобы определить комбинации для параметра вести себя и показать только идентификаторы комбинаций из одной группы.

Iпопытался использовать

SELECT a.productsid,
       a.variantid,
       b.variantid
FROM   products_bind_variant a
       INNER JOIN products_bind_variant b
               ON a.variantid < b.variantid

Однако, это возвращает 36 результатов, потому что оно сопоставляет себя с собой.Мне нужно это учитывать, чтобы найти только комбинации между типом группировки, которые бы составляли 24 комбинации.

Так что в основном это что-то вроде запроса идентификаторов.

Итак

69| 1,4,8 для малого, красного, 1-3 года

Вот комбинации, которые мне нужно сгенерировать, но не имена, ID варианта

Blue, 1-3 Years, Extra Large
Blue, 3-10 Years, Extra Large
Blue, 1-3 Years, Large
Blue, 3-10 Years, Large
Blue, 1-3 Years, Medium
Blue, 3-10 Years, Medium
Blue, 1-3 Years, Small
Blue, 3-10 Years, Small
Red, 1-3 Years, Extra Large
Red, 3-10 Years, Extra Large
Red, 1-3 Years, Large
Red, 3-10 Years, Large
Red, 1-3 Years, Medium
Red, 3-10 Years, Medium
Red, 1-3 Years, Small
Red, 3-10 Years, Small
White, 1-3 Years, Extra Large
White, 3-10 Years, Extra Large
White, 1-3 Years, Large
White, 3-10 Years, Large
White, 1-3 Years, Medium
White, 3-10 Years, Medium
White, 1-3 Years, Small
White, 3-10 Years, Small

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Будет получено 24 строки:

select
      `colour`, `range`, `size`, cid, sid, rid
from (select variantId cid, name `colour` from  variant where grouping = 'Colour') c
cross join (select variantId sid, name `size` from  variant where grouping = 'Size') s
cross join (select variantId rid, name `range` from  variant where grouping = 'Range') r

+----+--------+-----------+-------------+-----+-----+-----+
|    | colour |   range   |    size     | cid | sid | rid |
+----+--------+-----------+-------------+-----+-----+-----+
|  1 | Red    | 1-3 years | Small       |   4 |   1 |   8 |
|  2 | White  | 1-3 years | Small       |   5 |   1 |   8 |
|  3 | Blue   | 1-3 years | Small       |   6 |   1 |   8 |
|  4 | Red    | 1-3 years | Medium      |   4 |   2 |   8 |
|  5 | White  | 1-3 years | Medium      |   5 |   2 |   8 |
|  6 | Blue   | 1-3 years | Medium      |   6 |   2 |   8 |
|  7 | Red    | 1-3 years | Large       |   4 |   3 |   8 |
|  8 | White  | 1-3 years | Large       |   5 |   3 |   8 |
|  9 | Blue   | 1-3 years | Large       |   6 |   3 |   8 |
| 10 | Red    | 1-3 years | Extra Large |   4 |   7 |   8 |
| 11 | White  | 1-3 years | Extra Large |   5 |   7 |   8 |
| 12 | Blue   | 1-3 years | Extra Large |   6 |   7 |   8 |
| 13 | Red    | 3-10      | Small       |   4 |   1 |   9 |
| 14 | White  | 3-10      | Small       |   5 |   1 |   9 |
| 15 | Blue   | 3-10      | Small       |   6 |   1 |   9 |
| 16 | Red    | 3-10      | Medium      |   4 |   2 |   9 |
| 17 | White  | 3-10      | Medium      |   5 |   2 |   9 |
| 18 | Blue   | 3-10      | Medium      |   6 |   2 |   9 |
| 19 | Red    | 3-10      | Large       |   4 |   3 |   9 |
| 20 | White  | 3-10      | Large       |   5 |   3 |   9 |
| 21 | Blue   | 3-10      | Large       |   6 |   3 |   9 |
| 22 | Red    | 3-10      | Extra Large |   4 |   7 |   9 |
| 23 | White  | 3-10      | Extra Large |   5 |   7 |   9 |
| 24 | Blue   | 3-10      | Extra Large |   6 |   7 |   9 |
+----+--------+-----------+-------------+-----+-----+-----+

В таблице вариантов есть только 9 строк для единственного продукта: 3 цвета, 2 диапазона и 4 размера

SELECT
    b.productid, v.grouping, group_concat(v.name order by v.name separator ',') as variants
FROM products_bind_variant b
inner join variant v on b.variantid = v.variantid
group  by b.productid, v.grouping

+----+-----------+----------+--------------------------------+
|    | productid | grouping |            variants            |
+----+-----------+----------+--------------------------------+
|  1 |        69 | Colour   | Blue,Red,White                 |
|  2 |        69 | Range    | 1-3 years,3-10                 |
|  3 |        69 | Size     | Extra Large,Large,Medium,Small |
+----+-----------+----------+--------------------------------+

данныеиспользуется:

DROP TABLE IF EXISTS products_bind_variant;
CREATE TABLE products_bind_variant(
   itemId    INTEGER  NOT NULL
  ,productId INTEGER  NOT NULL
  ,variantId INTEGER  NOT NULL
);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (1,69,5);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (7,69,6);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (8,69,8);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (9,69,9);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (10,69,4);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (12,69,1);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (18,69,3);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (19,69,2);
INSERT INTO products_bind_variant(itemId,productId,variantId) VALUES (20,69,7);

DROP TABLE if exists variant;
CREATE TABLE variant(
   variantId INTEGER  NOT NULL
  ,name      VARCHAR(11) NOT NULL
  ,grouping  VARCHAR(6) NOT NULL
);
INSERT INTO variant(variantId,name,grouping) VALUES (1,'Small','Size');
INSERT INTO variant(variantId,name,grouping) VALUES (2,'Medium','Size');
INSERT INTO variant(variantId,name,grouping) VALUES (3,'Large','Size');
INSERT INTO variant(variantId,name,grouping) VALUES (4,'Red','Colour');
INSERT INTO variant(variantId,name,grouping) VALUES (5,'White','Colour');
INSERT INTO variant(variantId,name,grouping) VALUES (6,'Blue','Colour');
INSERT INTO variant(variantId,name,grouping) VALUES (7,'Extra Large','Size');
INSERT INTO variant(variantId,name,grouping) VALUES (8,'1-3 years','Range');
INSERT INTO variant(variantId,name,grouping) VALUES (9,'3-10','Range');
0 голосов
/ 19 декабря 2018

Если я правильно понимаю, вы хотите все варианты для каждой группировки для продукта.Если это так, подумайте об агрегации, а не JOIN:

SELECT v.grouping,
       pbv.productsid,
       grouup_concat(pbv.variantid) as variants
FROM products_bind_variant pbv JOIN
     variant v
     ON pvb1.variantid = v1.variantid 
GROUP BY v.grouping;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...