结合MySQL中的简单查询

时间:2016-12-03 13:53:39

标签: mysql subquery

我的表格如下service

id | service           | status | multicall | date_created         |
--------------------------------------------------------------------
10 | Cleaning          |    1   |      0    |  2016-09-20 19:11:01 |    
11 | Gardening         |    1   |      0    |  2016-09-20 19:12:07 |
12 | Dishes            |    1   |      1    |  2016-09-20 19:14:28 |    
13 | Take out rubbish  |    1   |      1    |  2016-09-20 19:14:28 |    

这是一个用户可以从他们希望有人做的服务中选择服务的表。 服务完成后,用户历史记录将保存在不同的表user_service_hist中:

id | user_id | service_id | date_created         |
--------------------------------------------------
1  |    1    |     10     |  2016-11-25 10:49:05
2  |    1    |     11     |  2016-11-27 23:58:46
3  |    1    |     12     |  2016-11-28 00:01:36
4  |    1    |     13     |  2016-11-28 12:07:17

用户只能选择每项服务一次,除了标有multicall column1的服务。

当我调用可用服务列表时,我使用以下查询:

SELECT s.id, s.service, s.date
from service s WHERE not exists (Select 1 from user_service_hist ush    
where ush.service_id = s.id AND ush.user_id = 1)

当用户完成所有服务时,此查询选择零行。 我想显示服务nr。 12和13总是因为它们的多列列值为1,无论它是否完成。 有人能告诉我如何修改我的查询吗?

2 个答案:

答案 0 :(得分:1)

您可以将查询与multicall

的union结合使用
  SELECT s.id, s.service, s.date
  from service s WHERE not exists (Select 1 from user_service_hist ush    
  where ush.service_id = s.id AND ush.user_id = 1)
  union 
  SELECT s.id, s.service, s.date
  from service s WHERE multicall  = 1

答案 1 :(得分:0)

您有两种可用服务条件:

  • 用户之前未使用过该服务。
  • 该服务是多方通话。

您只需要在查询中包含两者。第二个在where子句中作为附加条件:

select s.*
from service s 
where not exists (Select 1
                  from user_service_hist ush    
                  where ush.service_id = s.id and ush.user_id = 1
                 ) or
      s.multicall = 1;