【问题标题】:mysql query not giving accurate resultmysql查询没有给出准确的结果
【发布时间】:2015-12-08 10:24:39
【问题描述】:

我正在处理一个查询,其目的是获取所有金融年 ID!=4 的学生的记录,并且即使他/她的金融年 ID 不存在 4,也不显示记录。 我已经写了一个查询,但它给了我那个学生的记录,他的金融年_id!=4,但我想实现如果任何学生都存在金融年_id=4,则不会显示任何记录。

SELECT a.id aid
     , s.id sid
     , s.name
     , s.father_name
     , s.cnic
     , f.financialyear_id 
  FROM student s 
  JOIN academic_info a 
    ON a.s_id = s.id
  LEFT 
  JOIN fee_issued f 
    ON a.id = f.academic_info_id
 WHERE f.financialyear_id != 4 
   AND a.is_data_locked = 0 
   AND a.university_id = 60;

外键:s_id 在两个表 Academic_info 和 fee_issued 中,academic_info_id 在 fee_issued 表中。

【问题讨论】:

  • 如果你不想提供帮助,为什么你们所有人都拒绝投票,那么请不要看到这个。
  • 不错!男人真的很棒,你正在工作!但我会再去,因为你没有问题要回答
  • 顺便说一句,请注意 LEFT JOIN x WHERE x = 'a' 与 INNER JOIN x...
  • 投反对票的人最好解释一下原因
  • 不赞成票很有趣,但票数接近的投票实际上可能更有意义。 zeeshan,如果您愿意,请考虑遵循这个简单的两步操作: 1. 如果您还没有这样做,请提供适当的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。

标签: mysql sql


【解决方案1】:

您在请求中使用了关键字:“但我想实现的是,如果任何学生的 financeyear_id=4 存在,则不会显示任何记录。”所以使用EXISTS(或IN,其作用大致相同)来检查是否存在。

当您使用 MySQL 时,您必须为 academic_info 编写两次选择条件。其他 DBMS 可以更优雅地处理这个问题。

select a.id as aid, s.id as sid, s.name, s.father_name, s.cnic, f.financialyear_id
from student s
join academic_info a on a.s_id = s.id and a.is_data_locked = 0 and a.university_id = 60
left join fee_issued f on f.academic_info_id = a.id
where s.id not in
(
  select ai.s_id
  from academic_info ai
  join fee_issued fi on fi.academic_info_id = ai.id and fi.financialyear_id != 4
  where ai.is_data_locked = 0 and ai.university_id = 60
);

上面的查询还可以让您获得完全没有 fee_issued 的学生。如果您想删除这些,请将左连接更改为内连接。

编辑:这与 NOT EXISTS 相同。

select a.id as aid, s.id as sid, s.name, s.father_name, s.cnic, f.financialyear_id
from student s
join academic_info a on a.s_id = s.id and a.is_data_locked = 0 and a.university_id = 60
left join fee_issued f on f.academic_info_id = a.id
where not exists
(
  select *
  from academic_info ai
  join fee_issued fi on fi.academic_info_id = ai.id and fi.financialyear_id != 4
  where ai.is_data_locked = 0 and ai.university_id = 60
  and ai.s_id = s.id
);

【讨论】:

  • 我不想使用子查询...与加入相比还是很慢,谢谢您的回答
  • 我对此表示怀疑。这意味着 MySQL 是一个非常弱的 DBMS,无法正确处理简单的 IN/EXISTS 表达式。改用反连接,这似乎是您在这里想到的,这会使查询的可读性降低,我不建议走这条路。如果此查询对您来说太慢,那么您的数据库设置可能有问题。这根本不是一个复杂的查询,因此对于 DBMS 来说应该没有问题。
  • 但是与使用子查询的联接相比,您也知道联接比子查询更快,而且我有大量记录,那么在这种情况下您建议什么?
  • 我只是认为您在这里编造了一个不存在的问题。是的,连接通常更快,特别是当 DBMS 相当新并且ist 程序员除了非常基本的事情之外还不太关心其他事情时。但是,我敢说 MySQL 并非如此,因为 MySQL 并不新鲜。一个好的 DBMS 无论如何都会为查询找到最佳的执行计划。因此,如果 MySQL 发现 IN 子句最好以某种方式连接表,那么它会在内部这样做。
  • 我知道,一旦您处理了数十亿条记录以及非常庞大和复杂的查询,您可能会遇到需要欺骗 DBMS 找到正确方法的地步。但是你真的要处理那么多记录吗?即使是这样,这个查询根本不复杂,甚至根本不庞大。尽可能简单地编写您的查询。只有当您真正遇到性能问题时,才考虑替代方案。
猜你喜欢
  • 2012-06-23
  • 2011-08-16
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多