记录未出现在视图中但仍出现在查询查询结果中

时间:2014-03-25 14:17:37

标签: mysql view

在MySQL中,我已经在两个表上定义了一个视图,如下所示:

delimiter $$

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost`<br/>
SQL SECURITY DEFINER VIEW `test`.`viewinschrijvingen` AS<br/>
select `i`.`student` AS `student`,<br/>
`i`.`opleidingscode` AS `opleidingscode`,<br/>
`i`.`inschrijvingsvorm` AS `inschrijvingsvorm`,<br/>
`i`.`brin` AS `brin`,<br/>
`i`.`brinvolgnummer` AS `brinvolgnummer`,<br/>
`o`.`onderwijsvorm` AS `onderwijsvorm`,<br/>
`o`.`opleidingniveau` AS `opleidingniveau`,<br/>
`o`.`naamopleidingkort` AS `naamopleidingkort`,<br/>
`o`.`instelling` AS `instelling`,<br/>
`o`.`studielast` AS `studielast`,<br/>
date_format(max(str_to_date(`i`.`datuminschrijving`,'%Y-%m-%d')),'%Y-%m-%d') AS `datuminschrijving`,<br/>
`o`.`gemeentenaam` AS `gemeentenaam` from<br/>
(`test`.`inschrijvingen` `i` left outer join `test`.`opleidingen` `o`<br/>
on((`i`.`opleidingscode` = `o`.`opleidingscode`)))<br/>
group by `i`.`opleidingscode`,`i`.`brin`,`i`.`brinvolgnummer`$$<br/>

当我查询此视图以获取有关特定学生的信息时:

SELECT * FROM test.viewinschrijvingen WHERE student =&#39; 310018717&#39;

结果为空(没有记录返回)。当我浏览视图中的记录时,学生310018717(显然)没有记录。

但是,当我执行查询时,我用来直接创建视图:

select `i`.`student` AS `student`,<br/>
`i`.`opleidingscode` AS `opleidingscode`,<br/>
`i`.`inschrijvingsvorm` AS `inschrijvingsvorm`,<br/>
`i`.`brin` AS `brin`,<br/>
`i`.`brinvolgnummer` AS `brinvolgnummer`,<br/>
`o`.`onderwijsvorm` AS `onderwijsvorm`,<br/>
`o`.`opleidingniveau` AS `opleidingniveau`,<br/>
`o`.`naamopleidingkort` AS `naamopleidingkort`,<br/>
`o`.`instelling` AS `instelling`,<br/>
`o`.`studielast` AS `studielast`,<br/>
date_format(max(str_to_date(`i`.`datuminschrijving`,'%Y-%m-%d')),'%Y-%m-%d') AS `datuminschrijving`,<br/>
`o`.`gemeentenaam` AS `gemeentenaam` from<br/>
(`test`.`inschrijvingen` `i` left outer join `test`.`opleidingen` `o`
on((`i`.`opleidingscode` = `o`.`opleidingscode`)))<br/>
WHERE student = '310018717'<br/>
group by `i`.`opleidingscode`,`i`.`brin`,`i`.`brinvolgnummer`<br/>

我得到一个结果(1条记录,这是我预期的结果)。任何人都可以帮我找到造成这种行为的原因吗?

1 个答案:

答案 0 :(得分:0)

这可能与您使用MySQL的GROUP BY扩展名与ANSI GROUP BY格式有关。 MySQL不要求您对每个不是聚合函数的列进行分组。对于您没有进行GROUPing的列,MySQL可以为列选择所需的任何值。在您的情况下,您没有使用学生字段进行分组,因此可能无法选择您要搜索的值。

您可能想尝试使用ANSI GROUP BY的查询,看看是否得到了您想要的结果。

delimiter $$

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost`
SQL SECURITY DEFINER VIEW `test`.`viewinschrijvingen` AS
select 
  `i`.`student` AS `student`,
  `i`.`opleidingscode` AS `opleidingscode`,
  `i`.`inschrijvingsvorm` AS `inschrijvingsvorm`,
  `i`.`brin` AS `brin`,
  `i`.`brinvolgnummer` AS `brinvolgnummer`,
  `o`.`onderwijsvorm` AS `onderwijsvorm`,
  `o`.`opleidingniveau` AS `opleidingniveau`,
  `o`.`naamopleidingkort` AS `naamopleidingkort`,
  `o`.`instelling` AS `instelling`,
  `o`.`studielast` AS `studielast`,
  date_format(max(str_to_date(`i`.`datuminschrijving`,'%Y-%m-%d')),'%Y-%m-%d') AS `datuminschrijving`,
  `o`.`gemeentenaam` AS `gemeentenaam` 
from `test`.`inschrijvingen` `i` 
left outer join `test`.`opleidingen` `o`
  on `i`.`opleidingscode` = `o`.`opleidingscode`
group by 
  `i`.`student`,
  `i`.`opleidingscode`,
  `i`.`inschrijvingsvorm`,
  `i`.`brin` AS `brin`,
  `i`.`brinvolgnummer`,
  `o`.`onderwijsvorm`,
  `o`.`opleidingniveau`,
  `o`.`naamopleidingkort`,
  `o`.`instelling`,
  `o`.`studielast`,
  `o`.`gemeentenaam`$$