Как найти идентификаторы с суммой нескольких строк в MySQL?

Вот моя таблица MySQL.

CREATE TABLE IF NOT EXISTS  tbl_money  (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
amount  int(11) NOT NULL,
used  int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;

INSERT INTO  tbl_money  ( id ,  amount ,  used ) VALUES
(8, 2, 0),
(9, 4, 0),
(10, 4, 0),
(11, 3, 0),
(12, 8, 0),
(13, 10, 0),
(14, 13, 0);

Идентификатор является полем первичного ключа, и деньги могут иметь любое число от 1 до любого числа.

Проблема:
Предположим, мне нужно найти идентификатор из таблицы, где сумма равна 8. Это просто, потому что идентификатор 5 содержит сумму 8. Но если мне нужно найти идентификатор с 14 суммой, которая не существует. Теперь мне нужно выбрать 2 или более полей, сумма которых будет равна 14. Например, в приведенной выше таблице я могу выбрать идентификатор 6 и идентификатор 3, сумма суммы которых равна 14. То же самое, что если мне нужно найти 6, мне нужно выбрать id 1 и 2, потому что их сумма равна шести.

Иногда нам может понадобиться выбрать более 2 строк, чтобы получить равную сумму. Но если какое-либо условие не совпадает со всеми строками таблицы, мы можем вернуть 0.

Состояние:
Уже занятая строка, которую нельзя выбрать снова. Используемое поле всегда должно быть 0. Если значение используемых полей равно 1, мы не можем выбрать его. Мы будем искать только четные числа, поэтому нам не нужно беспокоиться о нечетных числах.

Пожалуйста, предложите мне, как решить этот алгоритм. Заранее спасибо.

0

Решение

Чистый SQL способ сделать это, что, вероятно, не так эффективно: —

SELECT CONCAT_WS(',', a.id, b.id, c.id, d.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id
INNER JOIN tbl_money c ON c.id > b.id
INNER JOIN tbl_money d ON d.id > c.id
WHERE a.amount + b.amount + c.amount + d.amount = 14
UNION
SELECT CONCAT_WS(',', a.id, b.id, c.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id
INNER JOIN tbl_money c ON c.id > b.id
WHERE a.amount + b.amount + c.amount = 14
UNION
SELECT CONCAT_WS(',', a.id, b.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id
WHERE a.amount + b.amount = 14
UNION
SELECT a.id
FROM tbl_money a
WHERE a.amount = 14

РЕДАКТИРОВАТЬ — изменение, чтобы проверить используемое поле, а также, что суммы не являются нечетными числами

SELECT CONCAT_WS(',', a.id, b.id, c.id, d.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id AND b.used = 1 AND MOD(b.amount, 2) = 0
INNER JOIN tbl_money c ON c.id > b.id AND c.used = 1 AND MOD(c.amount, 2) = 0
INNER JOIN tbl_money d ON d.id > c.id AND d.used = 1 AND MOD(d.amount, 2) = 0
WHERE a.amount + b.amount + c.amount + d.amount = 14
AND a.used = 1
AND MOD(a.amount, 2) = 0
UNION
SELECT CONCAT_WS(',', a.id, b.id, c.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id AND b.used = 1 AND MOD(b.amount, 2) = 0
INNER JOIN tbl_money c ON c.id > b.id AND c.used = 1 AND MOD(c.amount, 2) = 0
WHERE a.amount + b.amount + c.amount = 14
AND a.used = 1
AND MOD(a.amount, 2) = 0
UNION
SELECT CONCAT_WS(',', a.id, b.id)
FROM tbl_money a
INNER JOIN tbl_money b ON b.id > a.id AND b.used = 1 AND MOD(b.amount, 2) = 0
WHERE a.amount + b.amount = 14
AND a.used = 1
AND MOD(a.amount, 2) = 0
UNION
SELECT a.id
FROM tbl_money a
WHERE a.amount = 14
AND a.used = 1
AND MOD(a.amount, 2) = 0
1

Другие решения

Ниже просто идея, попробуйте реализовать ее в функции или SP.

Идея 1:

я. Найдите ли значение, которое вы получили СТРАННЫЙ или же ЧЕТНОЕ.

II. Если даже, то попробуйте добавить два ДАЖЕ числа или два ODD номера в вашем
таблицу и проверьте, соответствует ли она вашему значению.

III. Если нечетно, попробуйте добавить Один ДАЖЕ число и Один ODD число из вашей таблицы и проверьте, соответствует ли оно вашему значению.

внутривенно Если вы не получили результат, то

  • если даже, добавьте три ДАЖЕ чисел
  • если нечетно, добавьте три ODD числа или ДВА ДАЖЕ числа и ОДИН ODD число

Идея 2: (Это было бы довольно просто)

я. принимать первый значение скажем из ваших данных образца, принять значение 2 и добавить с другими значениями строки, как 2+4 == 14, 2+4 == 14, 2+3 == 14, 2+8 == 14, 2+10 == 14, 2+13 == 14

II. Затем взять Значение 2-й строки скажи ценность 4 и добавить с другими значениями, такими как 4+4 == 14, 4+3 == 14, 4+8 == 14, 4+10== 14, 4+13 == 14, Вот 4+10 соответствует значению 14, (Если вам нужна вся комбинация, тогда продолжайте, не прерывайте это выполнение).

III. Однажды до 10+13 комбинация сделана, затем добавьте первые два значения и добавьте другие значения, такие как 6+4, 6+3, 6+8, 6+10, 6+13

внутривенно продолжить до комбинации 31(2+4+4+3+8+10)+13

Надеюсь, это поможет вам немного.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector