2015-05-07 2 views
0

Я довольно новичок в MySQL (от FileMaker) и борюсь с этим. Мне нужно создать список из базы данных MySQL, которая соответствует этому определению: Список всех записей из таблицы Children, которые не имеют связанной записи в таблице Consultations, где содержимое поля Category отличается от first contact.MySQL Выберите: найдите записи со связанными записями только одного типа

Таким образом, список должен включать детей без консультации, а также тех, кто имеет только консультации 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

Это относится ко всем остальным РСУБД. Это не совсем так с MySQL - по крайней мере исторически: http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ – Strawberry

+0

Теперь это намного проще, спасибо за помощь! – Nico

+0

@Strawberry спасибо из замечания. Насколько я знаю, производительность в последних версиях mySQL намного лучше, я попытаюсь найти эталон и статью, которую я прочитал, так как, по моему мнению, запросы EXISTS теперь быстрее, чем LEFT JOINS. – vakata

Смежные вопросы