繁体   English   中英

结合 MySQL 查询,其中一个是排除查询

[英]Combining MySQL queries, with one being an exclusion query

第一个问题在这里,所以如果我错过了之前提出的问题,或者没有很好地格式化,我深表歉意......我的公司有一个我正在尝试改进的自定义 CRM + 数据库。 我们需要找到一份不会更新其年度服务的物业清单。 目前,我们通过首先查找将更新其服务的属性来做到这一点,这是通过以下查询完成的:

SELECT DISTINCT 
  j.`property_id` 
FROM
  `jobs` AS j 
  LEFT JOIN `property` AS p 
    ON j.`property_id` = p.`property_id` 
  LEFT JOIN `agency` AS a 
    ON p.`agency_id` = a.`agency_id` 
  INNER JOIN `property_services` AS ps 
    ON (
      j.`property_id` = ps.`property_id` 
      AND j.`service` = ps.`alarm_job_type_id`
    ) 
WHERE ps.`service` = 1 
  AND a.`country_id` = 1 
  AND (
    j.`status` = 'Pending' 
    OR j.`date` IS NULL 
    OR j.`date` = '0000-00-00' 
    OR j.`job_type` = 'Once-off' 
    OR j.`job_type` = '240v Rebook' 
    OR (
      j.`date` >= '2019-04-22' 
      AND j.`job_type` = 'Yearly Maintenance'
    )
  )

然后我们找到我们想要显示给用户的详细信息,不包括过程中的其他项目:

SELECT DISTINCT 
  j.`property_id`,
  p.`address_1` AS p_address1,
  p.`address_2` AS p_address2,
  p.`address_3` AS p_address3,
  p.`state` AS p_state,
  p.`postcode` AS p_postcode,
  a.`agency_id`,
  a.`agency_name` 
FROM
  `jobs` AS j 
  LEFT JOIN `property` AS p 
    ON j.`property_id` = p.`property_id` 
  LEFT JOIN `agency` AS a 
    ON p.`agency_id` = a.`agency_id` 
  INNER JOIN `property_services` AS ps 
    ON (
      j.`property_id` = ps.`property_id` 
      AND j.`service` = ps.`alarm_job_type_id`
    ) 
WHERE p.`property_id` NOT IN (INSERT HERE THE IDS YOU GOT FROM THE FIRST QUERY) 
  AND ps.`service` = 1 
  AND p.`deleted` = 0 
  AND p.`agency_deleted` = 0 
  AND a.`status` = 'active' 
  AND a.`country_id` = 1 
ORDER BY j.`property_id` DESC 
LIMIT 0, 50 

理想情况下,我想组合这些查询,或者以某种方式优化它们,因为页面当前需要 2 分钟以上才能加载,即使有索引也是如此。 再次道歉,我不是数据库或查询专家,我很确定学位只包括一两个主题!

作为记录(以防有人发现它有帮助),组合版本是:

    SELECT DISTINCT 
  j.`property_id`,
  p.`address_1` AS p_address1,
  p.`address_2` AS p_address2,
  p.`address_3` AS p_address3,
  p.`state` AS p_state,
  p.`postcode` AS p_postcode,
  a.`agency_id`,
  a.`agency_name` 
FROM
  `jobs` AS j 
  LEFT JOIN `property` AS p 
    ON j.`property_id` = p.`property_id` 
  LEFT JOIN `agency` AS a 
    ON p.`agency_id` = a.`agency_id` 
  INNER JOIN `property_services` AS ps 
    ON (
      j.`property_id` = ps.`property_id` 
      AND j.`service` = ps.`alarm_job_type_id`
    ) 
WHERE p.`property_id` NOT IN 
  (SELECT DISTINCT 
    j.`property_id` 
  FROM
    `jobs` AS j 
    LEFT JOIN `property` AS p 
      ON j.`property_id` = p.`property_id` 
    LEFT JOIN `agency` AS a 
      ON p.`agency_id` = a.`agency_id` 
    INNER JOIN `property_services` AS ps 
      ON (
        j.`property_id` = ps.`property_id` 
        AND j.`service` = ps.`alarm_job_type_id`
      ) 
  WHERE ps.`service` = 1 
    AND a.`country_id` = 1 
    AND (
      j.`status` = 'Pending' 
      OR j.`date` IS NULL 
      OR j.`date` = '0000-00-00' 
      OR j.`job_type` = 'Once-off' 
      OR j.`job_type` = '240v Rebook' 
      OR (
        j.`date` >= '2019-05-08' 
        AND j.`job_type` = 'Yearly Maintenance'
      )
    )) 
  AND ps.`service` = 1 
  AND p.`deleted` = 0 
  AND p.`agency_deleted` = 0 
  AND a.`status` = 'active' 
  AND a.`country_id` = 1 
  AND (
    j.`status` != 'Booked' 
    AND j.`status` != 'To Be Booked' 
    AND j.`status` != 'Send Letters' 
    AND j.`status` != 'On Hold' 
    AND j.`status` != 'On Hold - COVID' 
    AND j.`status` != 'Pre Completion' 
    AND j.`status` != 'Merged Certificates'
  ) 
  AND j.`date` > DATE_ADD(NOW(), INTERVAL - 350 DAY) 
ORDER BY j.`property_id` DESC

StackOverflow 之外的人帮助合并,但没有帮助......我们最终不得不添加一个标记并搜索它,因为这个查询在我们的数据库上运行了 193 秒。

此外,我完全得到了提供最小可重现示例的要求,而我没有这样做是我的错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM