Предполагая, что вы хотите одну случайную комбинацию, вы можете сделать:
select
*
from (
select
a.item_id as item1,
x.n as amount1,
a.value * x.n as sum1,
b.item_id as item2,
y.n as amount2,
b.value * y.n as sum2,
rand() as r
from my_table a
join my_table b on b.item_id <> a.item_id
cross join (
select 1 as n union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8
union select 9 union select 10) x
cross join (
select 1 as n union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8
union select 9 union select 10) y
where a.value * x.n + b.value * y.n = 10
) z
order by r -- sorted randomly
limit 1 -- to get only one combination; remove to get them all
Каждый раз, когда вы запускаете этот запрос, он выбирает случайное [другое] решение.
Сценарий для создания таблицы и данных, которые вы упомянули (которые я использовал для тестирования):
create table my_table (
item_id int,
value int
);
insert into my_table (item_id, value) values (1, 1);
insert into my_table (item_id, value) values (2, 4);
insert into my_table (item_id, value) values (3, 2);
insert into my_table (item_id, value) values (4, 6);
РЕДАКТИРОВАТЬ 1-го июля 2019 г. : В соответствии с запросом приведено эквивалентное [более короткое] решение с использованием рекурсивного CTE (общего выражения таблицы), доступное в MariaDB начиная с 10.2.2 (см. Рекурсивное общее Табличные выражения ):
with recursive
val as (select 1 as n union all select n + 1 from val where n < 10)
select
*
from (
select
a.item_id as item1,
x.n as amount1,
a.value * x.n as sum1,
b.item_id as item2,
y.n as amount2,
b.value * y.n as sum2,
rand() as r
from my_table a
join my_table b on b.item_id <> a.item_id
cross join val x
cross join val y
where a.value * x.n + b.value * y.n = 10
) z
order by r -- sorted randomly
limit 1 -- to get only one combination; remove to get all 22 answers
Это решение масштабируется намного лучше, если вам нужно использовать большее число.