2016-11-23 9 views
0

Вот моя таблица 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. Это просто, потому что id 5 содержит сумму 8. Но если мне нужно найти id с 14 суммой, которая не существует. Я должен выбрать 2 или более полей, сумма которых будет равна 14. Например, в приведенной выше таблице я могу выбрать id 6 и id 3, сумма которых равна 14. То же, что и мне нужно найти 6, мне нужно выбрать id 1 и 2, потому что их сумма равна шести.

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

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

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

+0

Неправильная структура таблицы. id int (11) NOT NULL, должен быть id int (11) NOT NULL AUTO_INCREMENT PRIMARY KEY –

+0

Если это так, то для получения значения '4',' id 1,2 и 5' также можно выбрать. Потому что вы упомянули «два или более полей». – Viki888

+0

@ Viki888 да брат. Это тоже вариант. –

ответ

1

Чистый путь 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 

EDIT - модифицирована для проверки используемого поля, а также о том, что суммы не являются нечетными числами

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 
+0

Вы Гениальный –

+0

можете проверить мой обновленный вопрос, пожалуйста. Ваш ответ сработал отлично, но я получил еще один conditon 'used' column. Спасибо –

+0

@ KrishnaKarki - добавлен мод – Kickstart

1

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

Идея 1:

я. Найдите, имеет ли значение, которое вы получили, ODD или EVEN.

ii. Если даже, попробуйте добавить две цифры EVEN или две цифры ODD в вашей таблице и проверьте, соответствует ли она вашей стоимости.

iii. Если нечетно, попробуйте добавить Один EVEN номер и Один номер ODD из вашего стола и проверьте, соответствует ли оно вашему значению.

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

  • если даже добавить три ДАЖЕ числа
  • если нечетное, добавить три ODD номера или две четные номера и ONE ODD номер

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

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

II. Затем возьмите Значение второй строки произнесите значение 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

iv. до тех пор, пока комбинация 31(2+4+4+3+8+10)+13

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