【问题标题】:Sanity check: Will this SQL query join how I want?健全性检查:这个 SQL 查询会按照我的意愿加入吗?
【发布时间】:2014-10-16 13:38:22
【问题描述】:

我对查询表示最深切的歉意,这是您的遗留代码。我基本上想检查我的代码是否合乎逻辑。

基本上我想返回“签名”表的所有行,其中“claim_id”=“claims”表上的“claim_id”。

据此,我打算检查每个声明的“signature_id”是否 = null。如果是,那么该声明没有相关签名,对吗?

$SQL="
SELECT
    `claims`.`claim_id`,
    CONCAT(`insurers`.`insurer_name`,IF((`insurers`.`insurer_branch`<>''),CONCAT(' - ',`insurers`.`insurer_branch`),'')) as 'insurer',
    `claims`.`claim_number` as 'claim_number',
    UNIX_TIMESTAMP(claims.overflow_date) as 'overflow_date',
    UNIX_TIMESTAMP(claims.reassigned_date) as 'reassigned_date',
    UNIX_TIMESTAMP(claims.reassigned_from_fr_date) as 'reassigned_from_fr_date',
    UNIX_TIMESTAMP(claims.date_of_first_contact) as 'date_of_first_contact',
    UNIX_TIMESTAMP(`claims`.`date_surveyor_made_contact`) as 'date_surveyor_made_contact',
    UNIX_TIMESTAMP(`claims`.`date_of_inspection`) as 'date_of_inspection',
    UNIX_TIMESTAMP(`claims`.`surveyor_completed`) as 'surveyor_completed',
    UNIX_TIMESTAMP( CASE 1 WHEN (claims.overflow_date>0) THEN claims.overflow_date WHEN (claims.reassigned_date>0) THEN claims.reassigned_date WHEN (claims.reassigned_from_fr_date>0) THEN claims.reassigned_from_fr_date ELSE claims.date_of_first_contact END ) as 'date_of_first_contact_debug',
    `claims`.`date_surveyor_made_contact` as 'date_surveyor_made_contact_debug',
    `claims`.`date_of_inspection` as 'date_of_inspection_debug',
    `claims`.`surveyor_completed` as 'surveyor_completed_debug',
    `claims`.`letter_of_findings`,
    `claims`.`int_settlement_reason`,
    `claims`.`ext_settlement_reason`,
    `claims`.`original_surveyor_id`,
    `claims`.`surveyor_id`,
    `claims`.`broker_name`,
    `insurers`.`insurer_type`,
    `insurers`.`insurer_id`,
    `signatures`.`signature_id`,
    `signatures`.`claim_id`
FROM
    (((`claims` claims INNER JOIN `insurers` insurers ON claims.`insurer_id` = insurers.`insurer_id`)
    INNER JOIN `users` users ON claims.surveyor_id = users.user_id) 
    LEFT JOIN `signatures` signatures on claims.claim_id = signatures.claim_id)
WHERE
    (`claims`.`claim_type` <> ".$conn->qstr(TYPE_DESKTOP).") AND 
    (`claims`.`claim_type` <> ".$conn->qstr(TYPE_AUDIT).") AND  
    (`claims`.`insurer_id` NOT IN ('".implode("','",$arrSURGE)."')) AND 
    (`users`.`status` = ".$conn->qstr(STATUS_LIVE).") AND
    (`claims`.`claim_cancelled_id` = 0) AND
    $where
";

我添加的代码都是signatures。选择器和LEFT JOIN 'signatures' signatures on claims.claim_id = signatures.claim_id) 行。

claim_id 是claims 表的PK,signature_id 是signatures 表的PK。

谢谢!

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于code review
  • 可以这样看。我更多的是寻求有关 LEFT JOIN 功能的帮助,以及它是否会返回所需的结果,而不是改进我知道有效的代码。
  • 您是否有理由不能自己测试以检查结果是否符合您的要求?

标签: php mysql sql


【解决方案1】:

空检查将仅显示带有签名的项目。如果您在图片中留下空值检查,您将得到不存在签名的项目的空值。

检查这个

【讨论】:

  • 这就是我一直在寻找的东西。非常有帮助,谢谢。
  • 图片不错。这个是从哪里来的?请引用您的来源。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多