2011-12-07 4 views
1

私は値入社結果

SELECT t2.id, t2.code, 
CASE t2.code WHEN 7 THEN (SELECT `7` FROM table1 t1 where t1.id = t2.rel) 
CASE t2.code WHEN 8 THEN (SELECT `8` FROM table1 t1 where t1.id = t2.rel) 
END as val 
FROM table2 t2 

を取得するために、次の文を使用していますが、私は、これらの値が加算された必要なので、それは、かなりまたは機能的でもないですが、掛けこのMySQLのシナリオに

table1 
-------------- 
id `7` `8` 
-------------- 
1 10 20 
2 20 30 

table 2 
--------------- 
id code rel 
--------------- 
3  7  1 
4  8  2 

を持っていますなど、多くの列があります。

これらのテーブルを結合してtable1を取得する方法はありますか? 7 t2.rel、t2.codeの値は?

SELECT t2.id, t2.code, eval(t1.(t2.code)) as val 
FROM table2 t2 
JOIN table1 t1 on t2.rel = t1.id 

に似 何かはどうもありがとうございました!

答えて

1

まだ関連性があるのか​​分かりませんが、

あなたがalredy知っているように、MySQLではピボットのようなものはありませんが、列数が定義されている場合は集計が比較的容易になります。

SELECT 
    SUM(IF(t2.code = 7, `7`, NULL)) as sum7, 
    AVG(IF(t2.code=8, `8`, NULL)) as avg8 
FROM t1 JOIN t2 
    ON t1.id = t2.rel; 
3

SQLクエリで参照されるすべての列は、クエリを作成する時点で修正する必要があります。 evalのようなものはありません。

あなたはCASE声明駆動するためのデータ値を使用することができますしかし:

SELECT t2.id, t2.code, 
    CASE t2.code WHEN '7' THEN t1.`7` WHEN '8' THEN t1.`8` END AS `val` 
FROM table2 t2 
JOIN table1 t1 ON t2.rel = t1.id; 

をしかし、あなたは、クエリを準備する前に、ハードコードにすべてのケースを持っていると思います。連続した行のデータに対して新しい値codeが見つかると、実行時にSQLが式を生成する方法はありません。

+0

私は元の質問を誤解し、私は私の答えを書き直し。 –

+0

はい、大文字と小文字を区別するのではなく、大文字と小文字を結合する方がよいです。 – egidiocs

1

私はあなたのやりたいことが可能かどうか不思議ですが、これは今のところ解決策になるかもしれません。あなたの結果に

あなたのコードのCONCATENATEで次に
|| *id* || *code* || *id* || *7* || *8* || 
    ------------------------------------------ 
    || 3 || 7  || 1 || 10 || 20 || 
    || 4 || 8  || 2 || 20 || 30 || 

に結果の

SELECT t2.id, t2.code, t1.* 
FROM table2 t2 
JOIN table1 t1 on t2.rel = t1.id 

: は、このような選択を行います。あなたは、PHPを使用して、結果が連想された場合 :

echo $result[$result['code']]; 

私はあなたがこのクエリで実現するために行くとは思いません。データベース設計を再考することもできます。

+0

はい、最良の方法は、データベースtable1テーブルを再設計することです。しかし、現時点ではオプションではありません....とにかく、ありがとう! – egidiocs