2013-08-27 93 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