0

MySQL ソフトウェア テーブル:

.------------------------------------------------------------.
| id | hostname   | software | version | install_date        |
|------------------------------------------------------------|
| 1  | computer-a | vim      | 1.00    | 2012-01-04 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-a | vim      | 2.00    | 2012-01-05 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-b | emacs    | 2.00    | 2012-01-04 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-b | emacs    | 1.00    | 2012-01-05 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-c | emacs    | 2.00    | 2012-01-05 00:00:00 | 
|------------------------------------------------------------|
| 1  | computer-c | vim      | 3.00    | 2012-01-05 00:00:00 | 
'------------------------------------------------------------'

MySQL クエリ:

SELECT 
  hostname,
  MAX(IF(software = 'vim', version, NULL)) AS VIM,
  MAX(IF(software = 'emacs', version, NULL)) AS EMACS
FROM
  software
GROUP BY
  hostname;

結果:

+-------------+---------+----------+
| hostname    | VIM     | EMACS    |
+-------------+---------+----------+
| computer-a  | 2.0     | NULL     |
+-------------+---------+----------+
| computer-b  | NULL    | 2.0      |
+-------------+---------+----------+
| computer-c  | 3.0     | 2.0      |
+-------------+---------+----------+

http://www.sqlfiddle.com/#!8/6247d/3

install_date問題は、それぞれの最新のバージョンを表示したいということですsoftware。コンピューター b は、EMACS に対して 1.0 を示しているはずです。これを達成するためにクエリをどのように変更できますか?

クエリを次のように変更できます。

SELECT 
  hostname,
  MAX(IF(software = 'vim', install_date, NULL)) AS VIM,
  MAX(IF(software = 'emacs', install_date, NULL)) AS EMACS
FROM
  software
GROUP BY
  hostname;

これは正しい install_date を取得しますが、対応するものを表示するにはどうすればよいversionですか?

http://www.sqlfiddle.com/#!8/6247d/4

4

1 に答える 1

1

サブクエリを使用してmax(install_date)for eachを取得しhostname、それをテーブルに結合できます。

select s1.hostname,
  MAX(IF(software = 'vim', version, NULL)) AS VIM,
  MAX(IF(software = 'emacs', version, NULL)) AS EMACS
from software s1
inner join
(
  select max(install_date) i_date,
    hostname
  from software
  group by hostname
) s2
  on s1.install_date = s2.i_date
  and s1.hostname = s2.hostname
group by s1.hostname

SQL Fiddle with Demoを参照してください。結果は次のとおりです。

|   HOSTNAME |    VIM |  EMACS |
--------------------------------
| computer-a |   2.00 | (null) |
| computer-b | (null) |   1.00 |
| computer-c |   3.00 |   2.00 |

が異なる可能性がある場合は、サブクエリでとのgroup by両方が必要になる場合があります。hostnamesoftwaresoftwareinstall_date

select s1.hostname,
  MAX(IF(s1.software = 'vim', version, NULL)) AS VIM,
  MAX(IF(s1.software = 'emacs', version, NULL)) AS EMACS
from software s1
inner join
(
  select max(install_date) i_date,
    hostname, software
  from software
  group by hostname, software
) s2
  on s1.install_date = s2.i_date
  and s1.hostname = s2.hostname
group by s1.hostname

デモで SQL Fiddle を参照してください

于 2013-03-29T00:46:26.670 に答える