2012-02-18 49 views
1

我有一張表,其中包含一些如下所示的值,並且我希望得出一些值,主題的摘要等於另一個值讓我們說像13:根據php中的值返回多個值的多個值mysql mysql

id values 

1 4 
2 7 
3 5 
4 6 

我想出去,等於13 朋友這些價值觀給我查詢:

SELECT t1.* FROM tables AS t1 
INNER JOIN tables AS t2 
WHERE t1.id != t2.id AND t1.`values` + t2.`values` = 13 

但它返回的只有兩個值,但讓我們說,我想兩個以上的值,甚至更像 4 + 7 + 5 = 16或4 + 7 + 5 + 6 = 22 我在這裏的意思是我不想只有兩個數字,有時我需要更多,這取決於我想要的值。請給我一個解決方案。

+1

要獲得涉及2行以上的組合,您需要更多連接。更多... – 2012-02-18 21:46:07

+0

感謝編輯即時通訊新的抱歉,你能給我一個例子嗎? – user2682025 2012-02-18 21:58:35

+0

在SQL中執行這些置換,您將需要儘可能多的連接,因爲您需要總和中的操作數,其中每個連接都具有像't1.id!= t2.id AND t2.id!= t3.id AND t1的條件。 id!= t3.id'等等,它會很快變得無恥。 – 2012-02-18 22:02:02

回答

0

臨時表:

group 
    sum  int 
    lastid int 
    ids loooooongtext 
    phase int 

初始化臨時表:

SET @SUM = 13; 

INSERT INTO group 
SELECT 
    tables.val AS sum, 
    tables.id AS lastid, 
    tables.id AS ids 
    0   AS phase 
FROM tables 
WHERE tables.val <= @SUM; 

和一些環路(你可以使用PHP或MySQL做循環),半SQL,半僞代碼:

SET @PHASE = 0; 

do 
    SET @PHASE = @PHASE + 1; 

    -- try to append new values to each group 
    INSERT INTO group 
    SELECT (group.sum + tables.val) AS sum, 
          tables.id AS lastid, 
    CONCAT(group.ids, ",", tables.id ) AS ids, 
      @PHASE      AS phase 
    FROM  group 
    INNER JOIN tables ON group.lastid < tables.id   -- monotonity to prevent (some) duplicates 
        AND group.sum + tables.val <= @SUM; 

    -- delete dead ends 
    DELETE 
    FROM group 
    WHERE group.phase < @PHASE 
    AND group.sum != @SUM; 

while ROW_COUNT() > 0; 

如果循環準備就緒,從groupgroup.ids讀取每行將c繼續table.ids。

+0

讓我們說我的表名是'音樂'我有'id'和'values'行,你可以給我最終的代碼來找到'22' – user2682025 2012-02-18 23:20:59

+0

我認爲你可以輕鬆地將上面的垃圾工作到php,只需更換'表格到音樂和sql @variables到php $變量,它應該可以工作。或者不是,我沒有測試它:) – biziclop 2012-02-18 23:25:45

+0

對不起,新的它會讓我變得複雜,我無法輕易讀取它們中的一些,例如(SET PHASE = PHASE + 1;) – user2682025 2012-02-19 00:04:56