2011-02-10 18 views
1
mysql> select * from facts; 
+----+---------+------------+---------+ 
| id | fact_id | fact_value | host_id | 
+----+---------+------------+---------+ 
| 1 |  1 | rh5  |  1 | 
| 2 |  1 | rh4  |  2 | 
| 3 |  2 | virtual |  1 | 
| 4 |  2 | virtual |  2 | 
| 5 |  3 | rack 2  |  1 | 
+----+---------+------------+---------+ 

mysql> select * from hosts; 
+---------+-----------+ 
| host_id | host_name | 
+---------+-----------+ 
|  1 | bellagio | 
|  2 | mirage | 
+---------+-----------+ 

は、私が使用したクエリは次のようん:表示mysqlの結果

mysql> select host_name,fact_value from hosts as a left join facts as b on 
    > b.host_id=a.host_id and b.fact_id in (1,2,3); 

+-----------+------------+ 
| host_name | fact_value | 
+-----------+------------+ 
| bellagio | rh5  | 
| bellagio | virtual | 
| bellagio | rack 2  | 
| mirage | rh4  | 
| mirage | virtual | 
+-----------+------------+ 

私は結果がホストごとに1行を印刷したい、それは別の行の各fact_valueを出力する方法に注目してください。私がIN句を持っている理由は、このテーブルが各ホストに40以上のカラムを持つからです。私はほんの一握りしか望んでいない(私はこの例では3つを選ぶ)。

ここが私が探しているものです。

+-----------+--------+-----------+-----------+ 
| host_name | value1 | value 2 | value 3 | 
+-----------+--------+-----------+-----------+ 
| bellagio | rh5 | virtual | rack 2 | 
| mirage | rh4 | virtual | NULL  | 
+-----------+--------+-----------+-----------+ 

答えて

0

これは...フィールド名の一部を付与された作品。

select distinct t0.host_id, t1.name, t2.value as os_type, t3.value as ip_addr, t4.value as rack, t5.value as host_owner, t6.value as host_memory, 
     t7.value as host_swap, t8.value as host_make, t9.value as host_model 
      FROM fact_values t0 left outer join hosts t1 on (t0.host_id=t1.id) 
        left outer join fact_values t2 on (t0.host_id=t2.host_id and t2.fact_name_id = 30) 
        left outer join fact_values t3 on (t0.host_id = t3.host_id and t3.fact_name_id = 13) 
        left outer join fact_values t4 on (t0.host_id = t4.host_id and t4.fact_name_id = 65) 
        left outer join fact_values t5 on (t0.host_id = t5.host_id and t5.fact_name_id = 81) 
        left outer join fact_values t6 on (t0.host_id = t6.host_id and t6.fact_name_id = 18) 
        left outer join fact_values t7 on (t0.host_id = t7.host_id and t7.fact_name_id = 51) 
        left outer join fact_values t8 on (t0.host_id = t8.host_id and t8.fact_name_id = 36) 
        left outer join fact_values t9 on (t0.host_id = t9.host_id and t9.fact_name_id = 47) 
      WHERE t1.name = '$hostname' 
2
SELECT GROUP_CONCAT(fact_value)... 
... 
GROUP BY host_name 
+0

ああ、私はそれが何を参照して、実際に私の投稿を編集させてください。私の悪い、私は自分の列に値を欲しかったので、私はPHPで簡単にデータを解析することができます。 – luckytaxi

+0

@luckytaxi:各ドメインの値が異なる場合はどうなりますか?とにかく、mysqlでは動的数値のために行うことは不可能です – zerkms

+0

しかし、GROUP_CONCAT(CONCAT( '|'、fact_value))とphp、explode( '|'、$ data) – symcbean

0

あなたは値列のそれぞれのビューを作成して、列を結合してみてください。

create view [first_values] as 
    select fact_value, host_id 
    from facts where fact_id = 1; 

create view [second_values] as 
    select fact_value, host_id 
    from facts where fact_id = 2; 

create view [third_values] as 
    select fact_value, host_id 
    from facts where fact_id = 3; 

今の列に参加:私は最後の掲載以降に変更された

select h.host_name, f.fact_value as value1, s.fact_value as value2, t.fact_value as value3 

from hosts as h 
    left join [first_values] as f on h.host_id = f.host_id 
    left join [second_values] as s on h.host_id = s.host_id 
    left join [third_values] as t on h.host_id = t.host_id; 
0
SELECT u.user_id,u2.acc_no AS pacc,u3.acc_no AS sacc 
FROM table_name AS u 
LEFT JOIN table_name AS u2 ON u2.user_id=u.user_id AND u2.acc_type='P' AND u2.lab_id = ? AND u2.category = 'SOMETHING' 
LEFT JOIN table_name AS u3 ON u3.user_id=u.user_id AND u3.acc_type='S' AND u3.lab_id = ? AND u3.category = 'SOMETHING' 
GROUP BY u.user_id 

私は同じテーブルから単一の行に複数の行を取得するにはabouveクエリを使用していました。私と一緒にうまく働いている..