2013-08-27 94 views
0

我有一個查詢。在這個查詢中,我使用了一個子查詢來從具有不同條件的同一個表中獲取數據,並且在主要查詢中,我提到了用於在子查詢中獲取數據的ID,並將條件表示爲在主查詢中考慮與ID不應該是空的。如果我在主查詢中使用帶有IN子句的單個ID,我的查詢可以正常工作,但是如果我在主查詢中使用多個ID並添加值不應該爲空的子句,則查詢不會給我所需的結果。這是我的查詢哪裏條件不適用於IN子句

SELECT e.id AS `Personal Number`, 
e.date AS `Date`, 
CONCAT(ep.firstname,' ',ep.lastname) AS `Employee Name`, 
IF(ep.sex='M','Male','Female') AS sex, 
DATE_FORMAT(p.birthdate,'%m/%d/%Y')AS birthdate, 
(SELECT `value` FROM employee_data WHERE history=87 AND DATE=e.date) AS `A`, 
(SELECT `value` FROM employee_data WHERE history=603 AND DATE=e.date) AS `B`, 
(SELECT `value` FROM employee_data WHERE history=82 AND DATE=e.date) AS `C`, 
(SELECT `value` FROM employee_data WHERE history=86 AND DATE=e.date) AS `D` 
FROM tbl e 
INNER JOIN employee ep ON e.id = ep.id 
INNER JOIN tbl2 ap ON ap.date=e.date 
INNER JOIN employee_data AS phd ON e.date = phd.date 
WHERE (phd.history IN(82,87,603,86) AND phd.value!='') AND ap.date BETWEEN '2013-01-01' AND '2013-09-01'AND e.status!='cancelled'. 

我不知道如何處理這個查詢。任何人都可以幫忙在此先感謝

+0

也發佈你的表結構。 –

+0

你有一次subqueried相同的ID? –

+0

什麼是phd.value!=''我認爲你在這裏錯了 – harsh4u

回答

0

由於您在select子句中使用篩選器獲取值,請在select子句中執行group by並獲取max()值。

max (SELECT `value` FROM employee_data WHERE history=87 AND DATE=e.date) AS `A`, 
max (SELECT `value` FROM employee_data WHERE history=603 AND encounter_nr=e.encounter_nr)  AS `B`, 
max (SELECT `value` FROM employee_data WHERE history=82 AND encounter_nr=e.encounter_nr) AS `C`, 
max (SELECT `value` FROM employee_data WHERE history=86 AND encounter_nr=e.encounter_nr) AS `D` 
FROM 
+0

我想從表中獲取數據的表結構是員工_data,其結構是 id,歷史記錄,值 – user2216168

0

這是你的問題。當您有where子句時,您的查詢產生四行。但是,我懷疑你只是期待一行,或者至少每行只有一行。

我想這是你想要的查詢:

SELECT e.id AS `Personal Number`, e.date AS `Date`, 
     CONCAT(ep.firstname,' ',ep.lastname) AS `Employee Name`, 
     IF(ep.sex='M','Male','Female') AS sex, 
     DATE_FORMAT(p.birthdate,'%m/%d/%Y') AS birthdate, 
     max(case when history = 87 then value end) as A, 
     max(case when history = 603 then value end) as B, 
     max(case when history = 82 then value end) as C, 
     max(case when history = 86 then value end) as D 
FROM tbl e INNER JOIN 
    employee ep 
    ON e.id = ep.id INNER JOIN 
    tbl2 ap ON ap.date = e.date INNER JOIN 
    employee_data phd 
    ON e.date = phd.date 
WHERE phd.history IN (82, 87, 603, 86) AND phd.value <> '' AND 
     ap.date BETWEEN '2013-01-01' AND '2013-09-01' AND 
     e.status <> 'cancelled' 
group by e.id; 

這應返回一行爲每個員工。

編輯:

它發生在我身上,你可能不想要聚合。您可以通過刪除在外部查詢的加盟employee_data按照你原來的做法:

SELECT e.id AS `Personal Number`, e.date AS `Date`, 
     CONCAT(ep.firstname,' ',ep.lastname) AS `Employee Name`, 
     IF(ep.sex='M','Male','Female') AS sex, 
     DATE_FORMAT(p.birthdate,'%m/%d/%Y') AS birthdate, 
     (SELECT `value` FROM employee_data WHERE history=87 AND DATE=e.date) AS `A`, 
     (SELECT `value` FROM employee_data WHERE history=603 AND DATE=e.date) AS `B`, 
     (SELECT `value` FROM employee_data WHERE history=82 AND DATE=e.date) AS `C`, 
     (SELECT `value` FROM employee_data WHERE history=86 AND DATE=e.date) AS `D` 
FROM tbl e INNER JOIN 
    employee ep 
    ON e.id = ep.id INNER JOIN 
    tbl2 ap ON ap.date = e.date 
WHERE ap.date BETWEEN '2013-01-01' AND '2013-09-01'AND e.status <> 'cancelled' 
HAVING A <> '' and B <> '' and C <> '' and D <> ''; 

having子句是一個MySQL的技巧,可以讓你參考列別名from子句。這並不意味着在這種情況下的聚合。

如果您有索引employee_data(history, date),您會這樣做。

+0

我想要的是在案例部分是我想根據主查詢的日期獲取數據。與ID 82,86,87,603一樣,數據在2013-01-01和2013-02-02日期輸入。我只想在所有id都不爲空的情況下考慮這兩個日期。如果這些id的任何值根據日期值爲空,則不應該被視爲 – user2216168

+0

非常感謝having子句的工作方式。謝謝 – user2216168