2015-06-22 137 views
2

我有一個表名tblnetworkstatus,我有11列PHP的MySQL查詢工作不正常

  1. 編號
  2. issue_name
  3. affected_server
  4. affected_service
  5. ISSUE_TYPE
  6. 優先
  7. 持續時間
  8. 狀態
  9. 起始日期
  10. END_DATE
  11. 描述

我在affected_server越來越ID和affected_service,我在我的數據庫正在存儲,現在我有三種情況

  1. 要麼都有, affected_server和affected_service已被選中
  2. 只選擇了affected_server
  3. 只有affected_service選擇

我正在從分別使用連接在三個表tblnetworkstatus,tblserver和tblproduct我已經下面的查詢從這裏

SELECT 
    m.issue_name ,m.issue_type , 
    m.priority ,m.status,m.description , 
    m.start_date,m.end_date,m.duration, 
    s.name as server_name,p.name as product_name 
    from mod_networkstatus as m 
    LEFT JOIN tblservers as s ON m.affected_server=s.id 
    LEFT JOIN tblproducts as p ON m.affected_service=p.id 
了tblserver和tblproducts affected_server和affected_service的名字

但是,如果我有受影響的服務器和affected_service的多個id,就像我將1,2,3,4存儲在單個列affected_server或affected_service那麼我該怎麼做?

回答

1

無需使用union,因爲它會給很多重複數據

要實現可以通過簡單的left joininner join

SELECT 
    m.issue_name ,m.issue_type , 
    m.priority ,m.status,m.description , 
    m.start_date,m.end_date,m.duration, 
    s.name as server_name,p.name as product_name 
    from mod_networkstatus as m 
    LEFT JOIN tblservers as s ON m.affected_server=s.id 
    LEFT JOIN tblproducts as p ON m.affected_service=p.id 

用於做什麼一列中有多個ID

SELECT 
    m.issue_name ,m.issue_type , 
    m.priority ,m.status,m.description , 
    m.start_date,m.end_date,m.duration, 
    s.name as server_name,p.name as product_name 
    from mod_networkstatus as m 
    LEFT JOIN tblservers as s ON FIND_IN_SET(m.affected_server,s.id) 
    LEFT JOIN tblproducts as p ON m.affected_service=p.id 

看看這是否適合你。

+0

我的榮幸.... :) –

+0

如果我有多個項目選擇,然後受感染的服務器列有id的那個1,2,3那麼我怎麼能做到這一點在單列上的多個ID ... –

+0

你需要使用'field_in_set'就像這樣'ON FIND_IN_SET(sometable.id,othertable.ids)' –

1

即使您的要求不是很清楚,仍按照您的要求,您可以使用下面的查詢。

SELECT m.issue_name ,m.issue_type ,m.priority ,m.status,m.description ,m.start_date,m.end_date,m.duration,s.name AS server_name,p.name AS product_name 
FROM tblnetworkstatus m 
LEFT JOIN tblservers s ON m.affected_server=s.id 
LEFT JOIN tblproducts p ON m.affected_service=p.id 
WHERE ((m.affected_server='Y' AND m.affected_service='Y') OR m.affected_server='Y' OR m.affected_service='Y'); 

注:如果不是你想要的,那麼請共享所有3個表樣本數據和所需輸出,這樣我可以幫助你。

根據您的最新更新,您可以嘗試它 -

SELECT m.issue_name ,m.issue_type ,m.priority ,m.status,m.description ,m.start_date,m.end_date,m.duration,s.name AS server_name,p.name AS product_name 
FROM tblnetworkstatus m 
LEFT JOIN tblservers s ON find_in_set(s.id,m.affected_server) 
LEFT JOIN tblproducts p ON find_in_set(p.id,m.affected_service) 
WHERE ((m.affected_server='Y' AND m.affected_service='Y') OR m.affected_server='Y' OR m.affected_service='Y'); 

注:但是,這不是一個好主意,因爲它不會使用索引和緩慢的過程。

+0

是的,但它給了我重複的記錄,我不想; 我想要顯示受影響服務器= server1,server2 ,server3等 –