mysql查询适用于某些特定记录,但不适用于所有数据

时间:2014-11-14 05:37:44

标签: mysql

student_detail   table

payment_detail with all data payment_detail   table![

student_detail表的第一张图片,第二张是我触发查询时的payment_detail表的图像

SELECT `student_detail`.`id`,
  `student_detail`.`first_name`,
  `student_detail`.`last_name`,
  `student_detail`.`course`,
  `payment_detail`.`id`,
  `student_id`,
  `inst_paid_date`,
  `next_inst_date`,
  `paid_installment`,
  `next_installment_amount` 
 FROM `student_detail`,`payment_detail` 
WHERE MONTH(`next_inst_date`)=MONTH(now()) 
  AND `inst_paid_date`<`next_inst_date` 
  AND `student_detail`.`id`=`student_id` 
  AND `student_id`='10' 
  AND `inst_paid_date` in(select max(`inst_paid_date`) from `payment_detail`)

当记录像第二个表一样存在时它不会给出任何结果但是如果我删除学生ID 8和9它给出了结果其他明智的我不能得到它与其他记录的冲突当特别设置where_条件与student_id = 10。谢谢先进

1 个答案:

答案 0 :(得分:1)

原因是您将inst_paid_date限制为整个payment_detail表中的最大值。由于此最大值适用于学生ID 9,因此与您在学生ID 10上的过滤器冲突。

尝试将相同的过滤器添加到子查询中,如下所示:

 WHERE 
     ...     
     AND `student_id`='10' 
     AND `inst_paid_date` in (select max(`inst_paid_date`) 
                              from `payment_detail`
                              where `student_id` = '10')

更通用的解决方案是将子查询转换为相关子查询。这需要在payment_detail表的外部引用上使用别名:

...
FROM `student_detail`,`payment_detail` as `PD`
WHERE MONTH(`next_inst_date`)=MONTH(now()) 
  AND `inst_paid_date`<`next_inst_date` 
  AND `student_detail`.`id`=`student_id` 
  AND `PD`.`student_id`='10' 
  AND `inst_paid_date` in(select max(`inst_paid_date`) 
                          from `payment_detail`
                          where `student_id` = `PD`.`student_id`)