2015-05-30 43 views
1
Name  Username Day worked Time period 
---------------------------------------------- 
John Doe john  Sunday  8 
Tom  tom   Monday  10 
Jane Doe jane  Tuesday  5 
John Doe john  Friday  9 

查询:如何根据两行条件选择列值?

SELECT username FROM table WHERE (day_worked='Sunday' AND time_period>5) AND (day_worked='Friday' and time_period>8) 

这里我申请条件的两列,用户谁在周日超过5小时和周五超过8小时的工作。显然,John Doe(用户名:john)符合条件,应该输出。

但是这不会返回任何东西。可能是我使用的逻辑是错误的。有任何想法吗?

+0

尝试:SELECT用户名FROM表WHERE(天_worked ='Sunday'AND time_period> 5)OR(day_worked ='Friday'and time_period> 8) – Dharmang

+0

@Dharmang:它必须是AND耦合的。我需要周日和周五都在单独工作的用户。 –

+0

@Dharmang他需要两个。 OR会匹配任何一种情况。我不认为这是他正在寻找的。我不认为他的榜样是最好的例子。他可以多次使用相同的用户名,适用于不同的日子和时间。他想知道世界卫生组织星期五工作超过8小时,星期天工作超过5小时,而不是任何一天。 –

回答

2

你可以通过一些交叉制表魔法来做到这一点。首先,交叉制表所有用户在周日和周五:

SELECT 
    username, 
    SUM(CASE WHEN `Day worked` = 'Sunday' THEN `Time Period` END) As Sunday, 
    SUM(CASE WHEN `Day worked` = 'Friday' THEN `Time Period` END) AS Friday 
FROM table 
GROUP BY username 

这个查询将产生以下

username Sunday Friday 
-------- ------ ------ 
jane  NULL NULL 
john  8  9 
tom  NULL NULL 

通过推动这个结果分解成一个子查询,你可以很容易地挑选出谁工作5个多小时,星期日及8小时以上周五:

SELECT username 
FROM (
    SELECT 
    username, 
     SUM(CASE WHEN `Day worked` = 'Sunday' THEN `Time Period` END) As Sunday, 
     SUM(CASE WHEN `Day worked` = 'Friday' THEN `Time Period` END) AS Friday 
    FROM table 
    GROUP BY username 
) SunFri 
WHERE SunFri.Sunday > 5 AND SunFri.Friday > 8 
0

您可以检查此查询是给你想要的结果

SELECT username FROM table 
INNER JOIN table T2 ON table.Username = T2.Username AND (day_worked='Friday' and time_period>8) 
WHERE (day_worked='Sunday' AND time_period>5) 

其更好地张贴sqlfiddle我们一起工作。

1
SELECT username 
    FROM table 
WHERE (day_worked='Sunday' AND time_period>5)   
    OR (day_worked='Friday' and time_period>8) 
GROUP 
    BY username 
HAVING COUNT(*) = 2