2011-02-10 5 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 | 
+-----------+------------+ 

Я хочу, чтобы результаты печати одну строку для каждого хоста, обратите внимание, как он печатает каждый 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 запрос, чтобы получить несколько строк в одной строки из той же таблицы. Который хорошо работает со мной.

Смежные вопросы