2013-04-06 132 views
0

我試圖想出一個SQL語句來打印Puppet數據庫中的所有重複[導出資源]定義。在SELECT語句中用另一個表替換另一個值

mysql> SELECT id,restype,host_id,source_file_id FROM resources  
    -> WHERE title IN (SELECT title FROM resources WHERE exported=1 
    -> GROUP BY title HAVING count(title) > 1) ORDER BY title; 
+------+------------------------+---------+----------------+ 
| id | restype    | host_id | source_file_id | 
+------+------------------------+---------+----------------+ 
| 305 | Nagios::Client::Export |  2 |    18 | 
| 333 | Nagios_host   |  2 |    39 | 
| 605 | Nagios_hostextinfo  |  6 |    2 | 
| 443 | Nagios_hostextinfo  |  2 |    39 | 
| 499 | Nagios_host   |  6 |    2 | 
| 770 | Nagios::Client::Export |  6 |    18 | 
...... 
...... 

這是工作得很好,但我怎麼能檢索/打印hosts.name主機表中host_id代替。我只是無法重寫上面的SQL語句。該主機表看起來像這樣:

mysql> SELECT id,name FROM hosts; 
+----+-----------------------------------------+ 
| id | name         | 
+----+-----------------------------------------+ 
| 2 | controller-dns-01.sdas.cloud.com  | 
| 6 | controller-monitoring-01.sdas.cloud.com | 
| 1 | controller-puppet.sdas.cloud.com  | 
| 13 | talend-admin-01.sdas.cloud.com   | 
| 15 | talend-jobserver-01.sdas.cloud.com  | 
| 14 | talend-jobserver-02.sdas.cloud.com  | 
+----+-----------------------------------------+ 

此外,有沒有辦法只打印在整個字符串代替的主機名(即僅controller-dns-01)的第一部分?任何人的任何建議不勝感激。乾杯!!


更新:
這是我最後的命令:就在情況下,如果別人也在尋找一種方式來找出木偶導出的資源重複定義

mysql> CREATE INDEX index_resources_on_restypetitle ON resources (restype(12),title(12)); 
mysql> SELECT r.id, r.restype, r.title, SUBSTRING_INDEX(h.name,'.',1) AS 'host_name', 
    -> SUBSTRING_INDEX(s.filename,'puppet/',-1) AS 'file_name', r.line FROM resources r 
    -> LEFT JOIN hosts h ON r.host_id = h.id LEFT JOIN source_files s ON r.source_file_id = s.id 
    -> WHERE MD5(CONCAT(restype,title,host_id)) 
    -> IN (SELECT MD5(CONCAT(restype,title,host_id)) FROM resources 
    -> WHERE exported=1 GROUP BY MD5(CONCAT(restype,title,host_id)) 
    -> HAVING COUNT(MD5(CONCAT(restype,title,host_id))) > 1) ORDER BY title; 

SUBSTRING_INDEX(s.filename....)位可能需要根據配置重新調整。非常感謝thiella幫助我。

+1

使用'SUBSTRING_INDEX()'函數來得到第一部分主機名。 – Barmar 2013-04-06 10:10:28

+0

@Barmar:謝謝!完全忘了那個SUBSTRING_INDEX()函數。乾杯!! – MacUsers 2013-04-06 11:07:40

回答

3

你需要與你的hosts表加入您的resources表,使用SUBSTRING_INDEX在點的左邊顯示字符串的一部分:

SELECT 
    r.id, r.restype, r.host_id, r.source_file_id, 
    SUBSTRING_INDEX(h.name, '.', 1) 
FROM 
    resources r LEFT JOIN hosts h 
    ON r.host_id = h.id 
WHERE 
    r.title IN (SELECT title 
      FROM resources 
      WHERE export=1 
      GROUP BY title 
      HAVING count(title) > 1) 
ORDER BY 
    r.title; 
+0

非常感謝,工作得很好。我正在考慮'JOIN',但我總是對它的工作方式感到困惑。只有一件事:它只花費了一分半鐘以上(28集(1分46.52秒))'在表格(資源)上完成,只有1562條記錄。這是正常的嗎?乾杯!! – MacUsers 2013-04-06 11:43:23

+0

@MacUsers它不應該那麼慢......我會嘗試在標題欄上添加一個索引,並在hosts.id上添加一個索引... ...乾杯:) – fthiella 2013-04-06 16:11:38

+0

再次感謝。在'title'上添加索引會將執行時間縮短到14秒,這是一個非常「預期」的結果。乾杯!! – MacUsers 2013-04-06 19:34:59

相關問題