mysql - 将 NOT EXISTS 查询和普通的 SELECT 查询组合成一个语句

标签 mysql not-exists

我在多个表中有一个查询:

SELECT s.id, st.service_type, s.service_measure, sp.id as `service_prov_id`,
sp.service_prov_name
from service s, service_prov_type_assign spta, service_prov_type_service_assign sptsa, 
service_type st, service_type_assign sta, service_provider sp 
WHERE sp.id = '3' AND spta.service_prov_id = sp.id AND
sptsa.service_prov_type_id = spta.service_prov_type_id AND 
s.id = sptsa.service_id AND sta.service_id = s.id AND 
st.id = sta.service_type_id

查询结果如下:

id | service_type | service_measure | service_prov_id | service_prov_name
--------------------------------------------------------------------------
7  |      a       |  Cleaning       |      1          |   Alex 
8  |      b       |  Driving        |      1          |   Alex
9  |      c       |  Writing        |      1          |   Alex

我想对上述查询应用 NOT EXISTS 查询:

SELECT s.id, s.service_measure 
FROM first_query
WHERE not exists (Select 1 
              from user_service_hist ush 
              where ush.service_id = s.id)

我的 user_service_hist ush 表如下所示:

id | service_id
--------------------
1  | 7
2  | 8

基本上,第一个查询的结果应该只显示尚未添加到 user_service_hist ush 表中的服务。

对于如何将这 2 个查询组合成一个语句的一些指示,我将不胜感激。

我希望我的结果如下所示:

id | service_type | service_measure | service_prov_id | service_prov_name
-------------------------------------------------------------------------
9  |      c       |  Writing        |      1          |   Alex

最佳答案

在这种情况下,只需使用 and 运算符将第二个查询的 where 子句添加到第一个查询:

SELECT s.id, st.service_type, s.service_measure, sp.id as `service_prov_id`,
sp.service_prov_name
from service s, service_prov_type_assign spta, service_prov_type_service_assign sptsa, 
service_type st, service_type_assign sta, service_provider sp 
WHERE sp.id = '3'
    AND spta.service_prov_id = sp.id
    AND sptsa.service_prov_type_id = spta.service_prov_type_id
    AND s.id = sptsa.service_id
    AND sta.service_id = s.id
    AND st.id = sta.service_type_id
    AND not exists (Select 1 
          from user_service_hist ush 
          where ush.service_id = s.id)

注意:我会使用显式连接语法而不是隐式连接语法来将连接条件与过滤条件分开。示例:

...
from service s
inner join service_prov_type_service_assign on s.id = sptsa.service_id
...

显然,您需要从 where 子句中删除 s.id = sptsa.service_id 条件。

关于mysql - 将 NOT EXISTS 查询和普通的 SELECT 查询组合成一个语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40488387/

相关文章:

清理所有数据的 PHP 函数

mysql - 联合主键顺序有什么区别吗?

php - 我怎样才能通过 Laravel 关系进行两次连接?

php - 以结构化方式显示连接的 mysql 数据,且不会造成性能损失

php - 不存在的地方 - MYSQL/PHP

sql-server - 如果记录不存在则插入到表中

mysql - Sequelize : How to order results by CHAR LENGTH?

使用 NOT EXISTS 的 SQL

SQL 服务器 : multiple WHERE NOT EXISTS clauses

MySQL 过程检查记录是否在插入不工作之前存在