2015-05-07 48 views
0

我对MySQL(来自FileMaker)非常陌生,并且很努力。我必须从满足该定义的MySQL数据库创建一个列表:列出表Children中没有任何相关记录的表Consultations中的所有记录,其中字段Category的内容不同于first contactMySQL Select:查找只有一种类型的相关记录的记录

所以列表中应该包括没有任何咨询的孩子以及那些只有first contact咨询但没有别的。

我的解决方案似乎可行,但即使只有一小部分样本记录也很慢。有没有更简单和/或更快的方法来做到这一点?

我试图

SELECT 
    Chi.ID, Chi.Name 
FROM 
    Children Chi JOIN Consultations Con ON Con.fk_Child = Chi.ID 
WHERE 
    NOT EXISTS (SELECT * FROM Consultations WHERE fk_Child = Chi.ID AND Categorie != 'first contact') 
GROUP BY 
    Chi.ID 

回答

1

你不需要加入磋商表(并因此 - 无需组的结果),也可以省略*子查询:

SELECT Chi.ID, Chi.Name FROM Children Chi 
WHERE NOT EXISTS 
    (SELECT 1 FROM Consultations WHERE fk_Child = Chi.ID AND Categorie != 'first contact') 

EXISTS语句是这类操作中速度最快的语句之一,如果删除JOIN和GROUP的速度还不够快,则必须查看这些表中的索引和数据类型 - 对于此特定查询 - 请确保Categorie是一个E如有可能,请输入NUM字段,并在fk_child上添加索引。

+0

所有其他RDBMSs都是如此。对于MySQL来说并非如此 - 至少在历史上是这样的:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ – Strawberry

+0

Now这确实更简单了,谢谢你的帮助! – Nico

+0

@Strawberry谢谢你的评论。据我所知在最近的mySQL版本中性能要好得多,我会试着找到我读的基准和文章,因为我相信EXISTS查询现在比LEFT JOINS更快。 – vakata

相关问题