2012-02-18 11 views
1

私は、表示されたようないくつかの値を含むテーブルを持っています。テーマの集計が別の値と等しいと言ういくつかの値を取得したいと思います。複数の値をPHP 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 

をそれが唯一の2つの値を返しますが、のは、私は以上の2つの値をしたいかさえましょうmore like 4 + 7 + 5 = 16または4 + 7 + 5 + 6 = 22 ここでは2つの数字しか必要としません。何度か必要ですが、それは必要な値に依存します。私に解決策を教えてください。

+1

2行以上の組み合わせを取得するには、より多くの結合が必要です。もっとたくさん... –

+0

編集のおかげで、ここに新しい、すみません、あなたは私に例を教えてくれますか? – user2682025

+0

これらの順列をSQLで実行するには、合計でオペランドを必要なだけ多く必要とします。それぞれの条件には、 't1.id!= t2.id AND t2.id!= t3.id AND t1のような条件があります。 id!= t3.id'など...それはすぐに大爆発するでしょう。 –

答えて

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; 

ループが準備できている場合は、各行をgroupから、group.idsをc table.idsを保持します。

+0

テーブル名が 'music'だとしましょう。 'id'と 'values'という行があります。 '22'を見つけるための最終的なコードを教えてください。 – user2682025

+0

上記のジャンクをPHPに簡単に置き換えて'tables'を音楽に、そしてsql @variablesをphp $変数に変換すると、うまくいくはずです。それとも、私はそれをテストしませんでした:) – biziclop

+0

ごめんなさい私のために複雑です私はそれを簡単に(いくつかのPHASE + 1;)のようないくつかのことを読むことができません新しい – user2682025

関連する問題