2016-11-23 66 views
0

這是我的mysql表。如何在mysql中查找帶有多行總和的ID?

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。它很簡單,因爲id 5包含數量8.但是,如果我必須找到id爲14的數量不存在。我必須選擇2個或更多的字段現在哪個總和將等於14.例如,在上面的表中,我可以選擇id 6和id 3,其總和等於14.同樣,如果我需要找到6我必須選擇id 1和2,因爲它們的金額總和等於六。

有時候我們可能需要選擇多於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 

編輯 - 修改爲檢查所使用的領域,也是數額不是奇數

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

你是Genious –

+0

你能否檢查我更新的問題。你的答案完美無缺,但我又多了一個'used'列的條件。謝謝 –

+0

@KrishnaKarki - mod增加了 – Kickstart

1

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

理念1:

我。找到你得到的價值是ODDEVEN

ii。如果連,然後嘗試在你的 表中增加兩個偶數號碼或兩個奇號,並檢查是否你的價值相匹配。

iii。如果奇數,則嘗試從表中添加一偶數量和一個奇怪數量,並檢查是否你的價值相匹配。

IV。如果你沒有得到結果,然後

  • 如果連加三連數字
  • 如果奇,加三奇號碼或兩個偶數號和一個奇怪

想法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

希望這會對你有所幫助。