簡體   English   中英

如何在MySQL中找到具有多行總和的ID?

[英]How to find ids with sum of multiple rows in 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);

id是主鍵字段,money可以具有從1到任意數字的任意數字。

問題:假設我必須從數量為8的表中找到ID,這很簡單,因為ID 5包含數量8。但是如果我必須找到ID與14的數量不存在。 我現在必須選擇2個或更多字段,它們的總和等於14。例如,在上表中,我可以選擇ID 6和ID 3,其總和等於14。就像我需要查找6一樣,我必須選擇id 1和2,因為它們的總和等於6。

有時,我們可能需要選擇兩行以上才能得出相等的總和。 但是,如果任何條件與表的所有行都不匹配,我們可以返回0。

條件:已被選擇的行不能再次選擇。 “使用的字段”應始終為0。如果“使用的字段”值為1,則無法選擇它。 我們只會搜索偶數,因此我們無需擔心奇數。

請建議我如何解決此算法。 提前致謝。

下面只是一個想法,請嘗試在函數或SP中實現它。

想法1:

一世。 查找您獲得的值是ODD還是EVEN

ii。 如果是偶數,則嘗試在表中添加兩個偶數兩個奇數 ,並檢查其是否與您的值匹配。

iii。 如果是奇數,請嘗試從表中添加一個偶數一個奇數,然后檢查它們是否與您的值匹配。

iv。 如果沒有得到結果,那么

  • 如果是偶數,則加上三個偶數
  • 如果為奇數,則添加三個奇數兩個偶數一個奇數

想法2 :(這很簡單)

一世。 從樣本數據中得出第一個值,然后取值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

希望這會對您有所幫助。

純粹的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM