How can you update a table with an ascending order position based on different groups in MYSQL?
up vote
1
down vote
favorite
I am struggling with this complex query. I am trying to insert the order position of some products.
For example,
I have currently table 1 with a position of NULL, I want to group each Product ID and assign each size a menu position based on ProductID group and using this FIND_IN_SET:
FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") asc;
In other words, I want it to look like Table2.
Table1
ID | ProductID | Size | Menu_position
1 | 100 | S | NULL
2 | 100 | M | NULL
3 | 100 | L | NULL
4 | 101 | 40 | NULL
5 | 101 | 41 | NULL
6 | 101 | 42 | NULL
7 | 102 | XS | NULL
8 | 102 | L | NULL
Table2
ID | ProductID | Size | Menu_position
1 | 100 | S | 1
2 | 100 | M | 2
3 | 100 | L | 3
4 | 101 | 40 | 1
5 | 101 | 41 | 2
6 | 101 | 42 | 3
7 | 102 | XS | 1
8 | 102 | L | 2
What I collected so far:
Number of products Group:select count(distinct ProductID) from Table1
Sort size based on specific order: SELECT * FROM Table1 ORDER BY FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") asc;
mysql sql if-statement while-loop
|
show 6 more comments
up vote
1
down vote
favorite
I am struggling with this complex query. I am trying to insert the order position of some products.
For example,
I have currently table 1 with a position of NULL, I want to group each Product ID and assign each size a menu position based on ProductID group and using this FIND_IN_SET:
FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") asc;
In other words, I want it to look like Table2.
Table1
ID | ProductID | Size | Menu_position
1 | 100 | S | NULL
2 | 100 | M | NULL
3 | 100 | L | NULL
4 | 101 | 40 | NULL
5 | 101 | 41 | NULL
6 | 101 | 42 | NULL
7 | 102 | XS | NULL
8 | 102 | L | NULL
Table2
ID | ProductID | Size | Menu_position
1 | 100 | S | 1
2 | 100 | M | 2
3 | 100 | L | 3
4 | 101 | 40 | 1
5 | 101 | 41 | 2
6 | 101 | 42 | 3
7 | 102 | XS | 1
8 | 102 | L | 2
What I collected so far:
Number of products Group:select count(distinct ProductID) from Table1
Sort size based on specific order: SELECT * FROM Table1 ORDER BY FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") asc;
mysql sql if-statement while-loop
what's the logic behind assigning such menu position?
– vivek_23
Nov 11 at 18:54
Do the menu positions for a Product ID have to be ascending? For example, if a product had only sizes "S" and "L", should the menu positions be 1 and 2, or are positions of 1 and 3 OK?
– rd_nielsen
Nov 11 at 19:00
You can put your sizes and menu position values (integers) into a table and join to that table to get the menu position for each size.
– rd_nielsen
Nov 11 at 19:01
@rd_nielsen Yes menu has to be chronological order 1 and 2, it cannot skip. This is why I just can't hard assign each value.
– Beck
Nov 11 at 19:06
@vivek_23 It is for a dropdown menu
– Beck
Nov 11 at 19:06
|
show 6 more comments
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I am struggling with this complex query. I am trying to insert the order position of some products.
For example,
I have currently table 1 with a position of NULL, I want to group each Product ID and assign each size a menu position based on ProductID group and using this FIND_IN_SET:
FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") asc;
In other words, I want it to look like Table2.
Table1
ID | ProductID | Size | Menu_position
1 | 100 | S | NULL
2 | 100 | M | NULL
3 | 100 | L | NULL
4 | 101 | 40 | NULL
5 | 101 | 41 | NULL
6 | 101 | 42 | NULL
7 | 102 | XS | NULL
8 | 102 | L | NULL
Table2
ID | ProductID | Size | Menu_position
1 | 100 | S | 1
2 | 100 | M | 2
3 | 100 | L | 3
4 | 101 | 40 | 1
5 | 101 | 41 | 2
6 | 101 | 42 | 3
7 | 102 | XS | 1
8 | 102 | L | 2
What I collected so far:
Number of products Group:select count(distinct ProductID) from Table1
Sort size based on specific order: SELECT * FROM Table1 ORDER BY FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") asc;
mysql sql if-statement while-loop
I am struggling with this complex query. I am trying to insert the order position of some products.
For example,
I have currently table 1 with a position of NULL, I want to group each Product ID and assign each size a menu position based on ProductID group and using this FIND_IN_SET:
FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") asc;
In other words, I want it to look like Table2.
Table1
ID | ProductID | Size | Menu_position
1 | 100 | S | NULL
2 | 100 | M | NULL
3 | 100 | L | NULL
4 | 101 | 40 | NULL
5 | 101 | 41 | NULL
6 | 101 | 42 | NULL
7 | 102 | XS | NULL
8 | 102 | L | NULL
Table2
ID | ProductID | Size | Menu_position
1 | 100 | S | 1
2 | 100 | M | 2
3 | 100 | L | 3
4 | 101 | 40 | 1
5 | 101 | 41 | 2
6 | 101 | 42 | 3
7 | 102 | XS | 1
8 | 102 | L | 2
What I collected so far:
Number of products Group:select count(distinct ProductID) from Table1
Sort size based on specific order: SELECT * FROM Table1 ORDER BY FIND_IN_SET(size,"UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60") asc;
mysql sql if-statement while-loop
mysql sql if-statement while-loop
edited Nov 11 at 19:21
asked Nov 11 at 18:51
Beck
175
175
what's the logic behind assigning such menu position?
– vivek_23
Nov 11 at 18:54
Do the menu positions for a Product ID have to be ascending? For example, if a product had only sizes "S" and "L", should the menu positions be 1 and 2, or are positions of 1 and 3 OK?
– rd_nielsen
Nov 11 at 19:00
You can put your sizes and menu position values (integers) into a table and join to that table to get the menu position for each size.
– rd_nielsen
Nov 11 at 19:01
@rd_nielsen Yes menu has to be chronological order 1 and 2, it cannot skip. This is why I just can't hard assign each value.
– Beck
Nov 11 at 19:06
@vivek_23 It is for a dropdown menu
– Beck
Nov 11 at 19:06
|
show 6 more comments
what's the logic behind assigning such menu position?
– vivek_23
Nov 11 at 18:54
Do the menu positions for a Product ID have to be ascending? For example, if a product had only sizes "S" and "L", should the menu positions be 1 and 2, or are positions of 1 and 3 OK?
– rd_nielsen
Nov 11 at 19:00
You can put your sizes and menu position values (integers) into a table and join to that table to get the menu position for each size.
– rd_nielsen
Nov 11 at 19:01
@rd_nielsen Yes menu has to be chronological order 1 and 2, it cannot skip. This is why I just can't hard assign each value.
– Beck
Nov 11 at 19:06
@vivek_23 It is for a dropdown menu
– Beck
Nov 11 at 19:06
what's the logic behind assigning such menu position?
– vivek_23
Nov 11 at 18:54
what's the logic behind assigning such menu position?
– vivek_23
Nov 11 at 18:54
Do the menu positions for a Product ID have to be ascending? For example, if a product had only sizes "S" and "L", should the menu positions be 1 and 2, or are positions of 1 and 3 OK?
– rd_nielsen
Nov 11 at 19:00
Do the menu positions for a Product ID have to be ascending? For example, if a product had only sizes "S" and "L", should the menu positions be 1 and 2, or are positions of 1 and 3 OK?
– rd_nielsen
Nov 11 at 19:00
You can put your sizes and menu position values (integers) into a table and join to that table to get the menu position for each size.
– rd_nielsen
Nov 11 at 19:01
You can put your sizes and menu position values (integers) into a table and join to that table to get the menu position for each size.
– rd_nielsen
Nov 11 at 19:01
@rd_nielsen Yes menu has to be chronological order 1 and 2, it cannot skip. This is why I just can't hard assign each value.
– Beck
Nov 11 at 19:06
@rd_nielsen Yes menu has to be chronological order 1 and 2, it cannot skip. This is why I just can't hard assign each value.
– Beck
Nov 11 at 19:06
@vivek_23 It is for a dropdown menu
– Beck
Nov 11 at 19:06
@vivek_23 It is for a dropdown menu
– Beck
Nov 11 at 19:06
|
show 6 more comments
2 Answers
2
active
oldest
votes
up vote
1
down vote
accepted
You can use variables in pre-MySQL 8.0:
SELECT t1.*,
(@rn := if(@p = productid, @rn + 1,
if(@p := productid, 1, 1)
)
) as menu_position
FROM (SELECT t1.*
FROM Table1 t1
ORDER BY ProductId,
FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60') asc
) AS alias CROSS JOIN
(SELECT @p := -1, @rn := 0) params;
In MySQL 8+, this is much simpler:
select t1.*,
row_number() over (partition by productid order by FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60')) as menu_position
from table1 t1
You guys are beasts! Thank you so much, hope to get at your level someday!
– Beck
Nov 11 at 19:44
Is there a way I can add this as a view? I keep getting Error 1351: View's SELECT contains a variable or parameter SQL Statement: CREATE OR REPLACE ALGORITHM = UNDEFINED
– Beck
Nov 11 at 20:18
@Beck . . . There is not an easy way to add this to a view. It is possible, but not really worth the effort, because the view would have to use a correlated subquery and would be expensive.
– Gordon Linoff
Nov 12 at 2:12
Thank you, I manage to put it into a store produce and made a temporary table.
– Beck
Nov 12 at 18:58
add a comment |
up vote
0
down vote
Create a two-column table containing all the the Size
values in one column and the integer order of those sizes in the second column--call that table menu_pos
. Join this to your Table
on size, to produce a table or view (call this product_pos
) containing columns product_id
, size
, and menu_pos
. Then modify the menu_pos
values to ensure that they are strictly sequential using a window function, such as:
select
product_id,
size,
rank() over (partition by product_id order by menu_pos) as new_menu_pos
from
product_pos;
Window functions require MySQL 8.
This wouldn't work. We can't create a new table since we can't fix a menu position. It might be1
for a particular data set,2
for another etc.
– vivek_23
Nov 11 at 19:35
The accessory table only needs the integers to be in ascending order, not sequential. The window function will ensure that the numbers are sequential.
– rd_nielsen
Nov 11 at 19:37
@rd_nielsen Please tag. What do you mean bythe integer order of those sizes in the second column
? If the window function ensures it's sequential order, why create a separate table in the DB? I think we could have the same table with a different name self joined with managing integer order of those sizes as their id itself(since it would be in ascending order anyway).
– vivek_23
Nov 11 at 19:48
@vivek_23 "By integer order of those sizes," I mean that if "S" is to sort before "M", then the integers assigned to "S" and "M" should reflect that order--that is, the integer for "S" is smaller than the integer for "M". If you create a separate table for this information, then your data are all in the database, not partly in the database and partly in your interface code.
– rd_nielsen
Nov 11 at 19:53
1
@vivek_23 Because "L" and "40" are for different product IDs. With an accessory table,Table1
doesn't need theMenu_position
column at all. The accessory table of size labels and menu position ordering integers would have very few rows, but accomplish the same purpose.
– rd_nielsen
Nov 11 at 20:03
|
show 2 more comments
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
You can use variables in pre-MySQL 8.0:
SELECT t1.*,
(@rn := if(@p = productid, @rn + 1,
if(@p := productid, 1, 1)
)
) as menu_position
FROM (SELECT t1.*
FROM Table1 t1
ORDER BY ProductId,
FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60') asc
) AS alias CROSS JOIN
(SELECT @p := -1, @rn := 0) params;
In MySQL 8+, this is much simpler:
select t1.*,
row_number() over (partition by productid order by FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60')) as menu_position
from table1 t1
You guys are beasts! Thank you so much, hope to get at your level someday!
– Beck
Nov 11 at 19:44
Is there a way I can add this as a view? I keep getting Error 1351: View's SELECT contains a variable or parameter SQL Statement: CREATE OR REPLACE ALGORITHM = UNDEFINED
– Beck
Nov 11 at 20:18
@Beck . . . There is not an easy way to add this to a view. It is possible, but not really worth the effort, because the view would have to use a correlated subquery and would be expensive.
– Gordon Linoff
Nov 12 at 2:12
Thank you, I manage to put it into a store produce and made a temporary table.
– Beck
Nov 12 at 18:58
add a comment |
up vote
1
down vote
accepted
You can use variables in pre-MySQL 8.0:
SELECT t1.*,
(@rn := if(@p = productid, @rn + 1,
if(@p := productid, 1, 1)
)
) as menu_position
FROM (SELECT t1.*
FROM Table1 t1
ORDER BY ProductId,
FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60') asc
) AS alias CROSS JOIN
(SELECT @p := -1, @rn := 0) params;
In MySQL 8+, this is much simpler:
select t1.*,
row_number() over (partition by productid order by FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60')) as menu_position
from table1 t1
You guys are beasts! Thank you so much, hope to get at your level someday!
– Beck
Nov 11 at 19:44
Is there a way I can add this as a view? I keep getting Error 1351: View's SELECT contains a variable or parameter SQL Statement: CREATE OR REPLACE ALGORITHM = UNDEFINED
– Beck
Nov 11 at 20:18
@Beck . . . There is not an easy way to add this to a view. It is possible, but not really worth the effort, because the view would have to use a correlated subquery and would be expensive.
– Gordon Linoff
Nov 12 at 2:12
Thank you, I manage to put it into a store produce and made a temporary table.
– Beck
Nov 12 at 18:58
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
You can use variables in pre-MySQL 8.0:
SELECT t1.*,
(@rn := if(@p = productid, @rn + 1,
if(@p := productid, 1, 1)
)
) as menu_position
FROM (SELECT t1.*
FROM Table1 t1
ORDER BY ProductId,
FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60') asc
) AS alias CROSS JOIN
(SELECT @p := -1, @rn := 0) params;
In MySQL 8+, this is much simpler:
select t1.*,
row_number() over (partition by productid order by FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60')) as menu_position
from table1 t1
You can use variables in pre-MySQL 8.0:
SELECT t1.*,
(@rn := if(@p = productid, @rn + 1,
if(@p := productid, 1, 1)
)
) as menu_position
FROM (SELECT t1.*
FROM Table1 t1
ORDER BY ProductId,
FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60') asc
) AS alias CROSS JOIN
(SELECT @p := -1, @rn := 0) params;
In MySQL 8+, this is much simpler:
select t1.*,
row_number() over (partition by productid order by FIND_IN_SET(size, 'UNI,XS,S,M,L,XL,XXL,3XL,4XL,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60')) as menu_position
from table1 t1
edited Nov 11 at 19:30
Raymond Nijland
7,67121327
7,67121327
answered Nov 11 at 19:25
Gordon Linoff
751k34286394
751k34286394
You guys are beasts! Thank you so much, hope to get at your level someday!
– Beck
Nov 11 at 19:44
Is there a way I can add this as a view? I keep getting Error 1351: View's SELECT contains a variable or parameter SQL Statement: CREATE OR REPLACE ALGORITHM = UNDEFINED
– Beck
Nov 11 at 20:18
@Beck . . . There is not an easy way to add this to a view. It is possible, but not really worth the effort, because the view would have to use a correlated subquery and would be expensive.
– Gordon Linoff
Nov 12 at 2:12
Thank you, I manage to put it into a store produce and made a temporary table.
– Beck
Nov 12 at 18:58
add a comment |
You guys are beasts! Thank you so much, hope to get at your level someday!
– Beck
Nov 11 at 19:44
Is there a way I can add this as a view? I keep getting Error 1351: View's SELECT contains a variable or parameter SQL Statement: CREATE OR REPLACE ALGORITHM = UNDEFINED
– Beck
Nov 11 at 20:18
@Beck . . . There is not an easy way to add this to a view. It is possible, but not really worth the effort, because the view would have to use a correlated subquery and would be expensive.
– Gordon Linoff
Nov 12 at 2:12
Thank you, I manage to put it into a store produce and made a temporary table.
– Beck
Nov 12 at 18:58
You guys are beasts! Thank you so much, hope to get at your level someday!
– Beck
Nov 11 at 19:44
You guys are beasts! Thank you so much, hope to get at your level someday!
– Beck
Nov 11 at 19:44
Is there a way I can add this as a view? I keep getting Error 1351: View's SELECT contains a variable or parameter SQL Statement: CREATE OR REPLACE ALGORITHM = UNDEFINED
– Beck
Nov 11 at 20:18
Is there a way I can add this as a view? I keep getting Error 1351: View's SELECT contains a variable or parameter SQL Statement: CREATE OR REPLACE ALGORITHM = UNDEFINED
– Beck
Nov 11 at 20:18
@Beck . . . There is not an easy way to add this to a view. It is possible, but not really worth the effort, because the view would have to use a correlated subquery and would be expensive.
– Gordon Linoff
Nov 12 at 2:12
@Beck . . . There is not an easy way to add this to a view. It is possible, but not really worth the effort, because the view would have to use a correlated subquery and would be expensive.
– Gordon Linoff
Nov 12 at 2:12
Thank you, I manage to put it into a store produce and made a temporary table.
– Beck
Nov 12 at 18:58
Thank you, I manage to put it into a store produce and made a temporary table.
– Beck
Nov 12 at 18:58
add a comment |
up vote
0
down vote
Create a two-column table containing all the the Size
values in one column and the integer order of those sizes in the second column--call that table menu_pos
. Join this to your Table
on size, to produce a table or view (call this product_pos
) containing columns product_id
, size
, and menu_pos
. Then modify the menu_pos
values to ensure that they are strictly sequential using a window function, such as:
select
product_id,
size,
rank() over (partition by product_id order by menu_pos) as new_menu_pos
from
product_pos;
Window functions require MySQL 8.
This wouldn't work. We can't create a new table since we can't fix a menu position. It might be1
for a particular data set,2
for another etc.
– vivek_23
Nov 11 at 19:35
The accessory table only needs the integers to be in ascending order, not sequential. The window function will ensure that the numbers are sequential.
– rd_nielsen
Nov 11 at 19:37
@rd_nielsen Please tag. What do you mean bythe integer order of those sizes in the second column
? If the window function ensures it's sequential order, why create a separate table in the DB? I think we could have the same table with a different name self joined with managing integer order of those sizes as their id itself(since it would be in ascending order anyway).
– vivek_23
Nov 11 at 19:48
@vivek_23 "By integer order of those sizes," I mean that if "S" is to sort before "M", then the integers assigned to "S" and "M" should reflect that order--that is, the integer for "S" is smaller than the integer for "M". If you create a separate table for this information, then your data are all in the database, not partly in the database and partly in your interface code.
– rd_nielsen
Nov 11 at 19:53
1
@vivek_23 Because "L" and "40" are for different product IDs. With an accessory table,Table1
doesn't need theMenu_position
column at all. The accessory table of size labels and menu position ordering integers would have very few rows, but accomplish the same purpose.
– rd_nielsen
Nov 11 at 20:03
|
show 2 more comments
up vote
0
down vote
Create a two-column table containing all the the Size
values in one column and the integer order of those sizes in the second column--call that table menu_pos
. Join this to your Table
on size, to produce a table or view (call this product_pos
) containing columns product_id
, size
, and menu_pos
. Then modify the menu_pos
values to ensure that they are strictly sequential using a window function, such as:
select
product_id,
size,
rank() over (partition by product_id order by menu_pos) as new_menu_pos
from
product_pos;
Window functions require MySQL 8.
This wouldn't work. We can't create a new table since we can't fix a menu position. It might be1
for a particular data set,2
for another etc.
– vivek_23
Nov 11 at 19:35
The accessory table only needs the integers to be in ascending order, not sequential. The window function will ensure that the numbers are sequential.
– rd_nielsen
Nov 11 at 19:37
@rd_nielsen Please tag. What do you mean bythe integer order of those sizes in the second column
? If the window function ensures it's sequential order, why create a separate table in the DB? I think we could have the same table with a different name self joined with managing integer order of those sizes as their id itself(since it would be in ascending order anyway).
– vivek_23
Nov 11 at 19:48
@vivek_23 "By integer order of those sizes," I mean that if "S" is to sort before "M", then the integers assigned to "S" and "M" should reflect that order--that is, the integer for "S" is smaller than the integer for "M". If you create a separate table for this information, then your data are all in the database, not partly in the database and partly in your interface code.
– rd_nielsen
Nov 11 at 19:53
1
@vivek_23 Because "L" and "40" are for different product IDs. With an accessory table,Table1
doesn't need theMenu_position
column at all. The accessory table of size labels and menu position ordering integers would have very few rows, but accomplish the same purpose.
– rd_nielsen
Nov 11 at 20:03
|
show 2 more comments
up vote
0
down vote
up vote
0
down vote
Create a two-column table containing all the the Size
values in one column and the integer order of those sizes in the second column--call that table menu_pos
. Join this to your Table
on size, to produce a table or view (call this product_pos
) containing columns product_id
, size
, and menu_pos
. Then modify the menu_pos
values to ensure that they are strictly sequential using a window function, such as:
select
product_id,
size,
rank() over (partition by product_id order by menu_pos) as new_menu_pos
from
product_pos;
Window functions require MySQL 8.
Create a two-column table containing all the the Size
values in one column and the integer order of those sizes in the second column--call that table menu_pos
. Join this to your Table
on size, to produce a table or view (call this product_pos
) containing columns product_id
, size
, and menu_pos
. Then modify the menu_pos
values to ensure that they are strictly sequential using a window function, such as:
select
product_id,
size,
rank() over (partition by product_id order by menu_pos) as new_menu_pos
from
product_pos;
Window functions require MySQL 8.
edited Nov 11 at 19:32
answered Nov 11 at 19:25
rd_nielsen
1,6152615
1,6152615
This wouldn't work. We can't create a new table since we can't fix a menu position. It might be1
for a particular data set,2
for another etc.
– vivek_23
Nov 11 at 19:35
The accessory table only needs the integers to be in ascending order, not sequential. The window function will ensure that the numbers are sequential.
– rd_nielsen
Nov 11 at 19:37
@rd_nielsen Please tag. What do you mean bythe integer order of those sizes in the second column
? If the window function ensures it's sequential order, why create a separate table in the DB? I think we could have the same table with a different name self joined with managing integer order of those sizes as their id itself(since it would be in ascending order anyway).
– vivek_23
Nov 11 at 19:48
@vivek_23 "By integer order of those sizes," I mean that if "S" is to sort before "M", then the integers assigned to "S" and "M" should reflect that order--that is, the integer for "S" is smaller than the integer for "M". If you create a separate table for this information, then your data are all in the database, not partly in the database and partly in your interface code.
– rd_nielsen
Nov 11 at 19:53
1
@vivek_23 Because "L" and "40" are for different product IDs. With an accessory table,Table1
doesn't need theMenu_position
column at all. The accessory table of size labels and menu position ordering integers would have very few rows, but accomplish the same purpose.
– rd_nielsen
Nov 11 at 20:03
|
show 2 more comments
This wouldn't work. We can't create a new table since we can't fix a menu position. It might be1
for a particular data set,2
for another etc.
– vivek_23
Nov 11 at 19:35
The accessory table only needs the integers to be in ascending order, not sequential. The window function will ensure that the numbers are sequential.
– rd_nielsen
Nov 11 at 19:37
@rd_nielsen Please tag. What do you mean bythe integer order of those sizes in the second column
? If the window function ensures it's sequential order, why create a separate table in the DB? I think we could have the same table with a different name self joined with managing integer order of those sizes as their id itself(since it would be in ascending order anyway).
– vivek_23
Nov 11 at 19:48
@vivek_23 "By integer order of those sizes," I mean that if "S" is to sort before "M", then the integers assigned to "S" and "M" should reflect that order--that is, the integer for "S" is smaller than the integer for "M". If you create a separate table for this information, then your data are all in the database, not partly in the database and partly in your interface code.
– rd_nielsen
Nov 11 at 19:53
1
@vivek_23 Because "L" and "40" are for different product IDs. With an accessory table,Table1
doesn't need theMenu_position
column at all. The accessory table of size labels and menu position ordering integers would have very few rows, but accomplish the same purpose.
– rd_nielsen
Nov 11 at 20:03
This wouldn't work. We can't create a new table since we can't fix a menu position. It might be
1
for a particular data set, 2
for another etc.– vivek_23
Nov 11 at 19:35
This wouldn't work. We can't create a new table since we can't fix a menu position. It might be
1
for a particular data set, 2
for another etc.– vivek_23
Nov 11 at 19:35
The accessory table only needs the integers to be in ascending order, not sequential. The window function will ensure that the numbers are sequential.
– rd_nielsen
Nov 11 at 19:37
The accessory table only needs the integers to be in ascending order, not sequential. The window function will ensure that the numbers are sequential.
– rd_nielsen
Nov 11 at 19:37
@rd_nielsen Please tag. What do you mean by
the integer order of those sizes in the second column
? If the window function ensures it's sequential order, why create a separate table in the DB? I think we could have the same table with a different name self joined with managing integer order of those sizes as their id itself(since it would be in ascending order anyway).– vivek_23
Nov 11 at 19:48
@rd_nielsen Please tag. What do you mean by
the integer order of those sizes in the second column
? If the window function ensures it's sequential order, why create a separate table in the DB? I think we could have the same table with a different name self joined with managing integer order of those sizes as their id itself(since it would be in ascending order anyway).– vivek_23
Nov 11 at 19:48
@vivek_23 "By integer order of those sizes," I mean that if "S" is to sort before "M", then the integers assigned to "S" and "M" should reflect that order--that is, the integer for "S" is smaller than the integer for "M". If you create a separate table for this information, then your data are all in the database, not partly in the database and partly in your interface code.
– rd_nielsen
Nov 11 at 19:53
@vivek_23 "By integer order of those sizes," I mean that if "S" is to sort before "M", then the integers assigned to "S" and "M" should reflect that order--that is, the integer for "S" is smaller than the integer for "M". If you create a separate table for this information, then your data are all in the database, not partly in the database and partly in your interface code.
– rd_nielsen
Nov 11 at 19:53
1
1
@vivek_23 Because "L" and "40" are for different product IDs. With an accessory table,
Table1
doesn't need the Menu_position
column at all. The accessory table of size labels and menu position ordering integers would have very few rows, but accomplish the same purpose.– rd_nielsen
Nov 11 at 20:03
@vivek_23 Because "L" and "40" are for different product IDs. With an accessory table,
Table1
doesn't need the Menu_position
column at all. The accessory table of size labels and menu position ordering integers would have very few rows, but accomplish the same purpose.– rd_nielsen
Nov 11 at 20:03
|
show 2 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53252030%2fhow-can-you-update-a-table-with-an-ascending-order-position-based-on-different-g%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
what's the logic behind assigning such menu position?
– vivek_23
Nov 11 at 18:54
Do the menu positions for a Product ID have to be ascending? For example, if a product had only sizes "S" and "L", should the menu positions be 1 and 2, or are positions of 1 and 3 OK?
– rd_nielsen
Nov 11 at 19:00
You can put your sizes and menu position values (integers) into a table and join to that table to get the menu position for each size.
– rd_nielsen
Nov 11 at 19:01
@rd_nielsen Yes menu has to be chronological order 1 and 2, it cannot skip. This is why I just can't hard assign each value.
– Beck
Nov 11 at 19:06
@vivek_23 It is for a dropdown menu
– Beck
Nov 11 at 19:06