2013-03-27 65 views
2

不知道要搜索什麼,所以這可能是一個重複的問題。我有一個名爲軟件的單一表的MySQL數據庫。該軟件表包括以下字段:來自MySQL的HTML表格,具有最新和唯一的值

id (auto_increment) 
computer_name 
software_name 
software_version 
install_date 

每一個軟件安裝,升級或恢復到以前的版本的新條目被製成表格的時間。

我想建一個表用PHP會看起來像這樣:

.---------------------------------------------------. 
|   | software x | software y | software z | 
|---------------------------------------------------| 
| computer a | ver 1.0 |   | ver 1.2 | 
|---------------------------------------------------| 
| computer b |   | ver 2.1 |   | 
|---------------------------------------------------| 
| computer c | ver 1.3 | ver 1.1 |   | 
'---------------------------------------------------' 

從數據像這樣:

computer_name | software_name | software_version | install_date 
---------------------------------------------------------------------- 
computer a  | software x  | ver 1.1   | [10 days ago] 
computer a  | software x  | ver 1.0   | [2 days ago] 
computer a  | software z  | ver 1.1   | [20 days ago] 
computer a  | software z  | ver 1.2   | [5 days ago] 

install_date將是一個實際的日期,加送[ X天前]爲了方便起見。

該表將顯示每臺計算機上安裝的每個軟件的最新版本,每個唯一計算機條目只有一行,每個唯一軟件條目只有一列。

這可能與一個單一的MySQL表?什麼是實現這一目標的最佳方式?我使用codeigniter使用PHP和MySQL。

更新:

從看可能重複的問題,我能夠準備這個查詢:

SET @sql = NULL; 

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(IF(software_name = ''', 
     software_name, 
     ''', software_version, NULL)) AS ', 
     replace(software_name, ' ', '_') 
    ) 
) INTO @sql 
FROM 
    software; 

SET @sql = CONCAT('SELECT computer_name, ', @sql, ' FROM software GROUP BY computer_name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

這在我要找的格式產生的結果,但是它沒有得到版本由最新的install_date,而是由發現的最大版本號。我如何修改以上版本以獲得最新相關版本install_date的版本?

+0

本表中是否有任何一種主鍵字段(也許是自動增量)? – 2013-03-27 19:49:43

+0

是的,有一個自動遞增的ID字段。更新問題... – codybuell 2013-03-27 19:52:50

+0

如果安裝日期是一個unix時間戳,則不需要自動增量主鍵(即使我身體中的每個骨頭都告訴我應該有一個主鍵),並且您可以通過install_date降序進行排序。然而,設置一個主鍵和一個簡單的選擇不同應該工作... – 2013-03-27 20:02:02

回答

0

像這樣的東西應該工作(比使用不同的速度快很多)。

select computer_name,software_name,software_version,install_date from table group by software_name order by computer_name,install_date DESC 

這樣您仍然可以在每臺計算機上顯示所有軟件。

如果你想限制進入每臺計算機安裝了最新的軟件,你可以使用:

select computer_name,software_name,software_version,install_date from table group by computer_name,software_name order by computer_name,install_date DESC 
1

一個艱苦的工作,但我有一個查詢,將取得的結果!

你需要在數據庫端的東西就像CROSS JOIN能夠列出所有不同的計算機對所有不同的軟件,然後過濾所需的software_version

我做到了與此查詢:

SELECT 
    b.computer_name, 
    a.software_name, 
    MAX(IF(b.software_name = a.software_name AND b.id = a.id, a.software_version, '')) AS software_version 
FROM 
    software AS a, 
    software AS b 
GROUP BY 
    b.computer_name, 
    a.software_name 
ORDER BY 
    b.computer_name ASC, 
    a.software_name ASC, 
    software_version DESC; 

我的表中的數據有這些值:

 
------ --------------- --------------- ------------------ --------------------- 
| id | computer_name | software_name | software_version | install_date  | 
--------------- ------ --------------- ------------------ --------------------- 
| 1 | computer a | software x | ver 1.1   | 2013-03-27 15:58:17 | 
| 2 | computer a | software x | ver 1.0   | 2013-03-27 15:58:20 | 
| 3 | computer a | software z | ver 1.3   | 2013-03-27 15:58:24 | 
| 4 | computer b | software z | ver 1.4   | 2013-03-27 15:58:30 | 
| 5 | computer b | software z | ver 1.2   | 2013-03-27 15:58:45 | 
| 6 | computer c | software x | ver 1.5   | 2013-03-27 15:58:51 | 
| 7 | computer c | software y | ver 1.7   | 2013-03-27 15:58:58 | 
--------------- ------ --------------- ------------------ --------------------- 

這是我的輸出:

 
------------ ------------ ------------------ 
| computer | software | software_version | 
------------ ------------ ------------------ 
| computer a | software x | ver 1.1   | 
| computer a | software y |     | 
| computer a | software z | ver 1.3   | 
| computer b | software x |     | 
| computer b | software y |     | 
| computer b | software z | ver 1.4   | 
| computer c | software x | ver 1.5   | 
| computer c | software y | ver 1.7   | 
| computer c | software z |     | 
------------ ------------ ------------------ 

在你的PHP代碼,你應該這樣做(正如我所知道的純PHP--我沒有測試下面的PHP代碼,它不是編碼的最佳方式......但我認爲它會工作,它的基礎上我的查詢輸出):

<?php 
    $sql = 'SELECT ...'; // put the query here 
    $result = mysql_query($sql); 

    if($result and mysql_num_rows($result)) 
    { 
    $num_rows = mysql_num_rows($result); 

    $versions = array(); 
    while ($row = mysql_fetch_assoc($result)) 
     $versions[] = $row; 

    // Here we'll count how much softwares we have 
    $software_count = -1; 
    $first_computer = $versions[0]['computer_name']; 

    while($versions[++$software_count]['computer_name'] == $first_computer); 

    echo "<table>". 
      "<thead>". 
      "<tr>". 
       "<th></th>"; 

    // Here we'll print the softwares names as our table headers 
    for($i = 0; $i < $software_count; $i++) 
     echo "<th>". $versions[$i]['software_name'] . "</th>"; 

    echo  "</tr>". 
      "</thead>". 
      "<tbody>"; 

    // Here we'll print the data 
    while($num_rows) 
    { 
     echo "<tr>". 
       "<td style='font-weight: bold;'>". 
       $versions[$i]["computer_name"] . 
       "</td>"; 

     for($i = 0; $i < $software_count; $i++) 
     echo "<td>". $versions[$i]["software_version"] . "</td>"; 

     echo "</tr>"; 

     $num_rows -= $software_count; 
    } 

    echo "</tbody>". 
     "</table>"; 

    mysql_free_result($result); 

?> 

一點工作,但我希望它可以幫助你,我希望我的PHP代碼工作正常!祝你好運!

+0

看起來不錯,但是'computer b'應該有'ver 1.2'作爲'software z'的安裝版本,因爲它是在'ver 1.4'之後安裝的。任何方式來糾正? – codybuell 2013-03-28 20:33:41

+0

@codybuell我以爲你想要最高的軟件版本,而不是最後安裝的版本...我會嘗試修改... – 2013-03-28 23:02:47