Найти такие условия, как «НЕ СУЩЕСТВУЕТ»

У меня есть 2 таблицы в моей БД...

Entita
id int(11)
descrizione varchar(50)
.....< бр />

Publicobjects
....
model varchar(50) нужная мне модель (в данном случае 'Entita' )
model_id int(11)

Я хотел бы сделать такой запрос:
select entita.* from entita where NOT EXISTS (select * from publicobjects where publicobjects.model = 'Entita' and publicobjects.model_id = entita.id)

Как я могу сделать это с функциями модели Cakephp без использования пользовательского запроса?

Спасибо


person Andrea F.    schedule 16.12.2009    source источник
comment
Я не думаю, что WHERE NOT EXISTS является допустимым выражением (My)SQL, и я не могу себе представить, как вы все равно будете выбирать несуществующие записи. Можете ли вы описать словами, что вы хотите получить?   -  person deceze♦    schedule 17.12.2009
comment
Да, это допустимое выражение MySql... см. здесь: dev.mysql.com/doc/refman/5.0/en/ :)   -  person Andrea F.    schedule 17.12.2009
comment
Упс, узнал кое-что новое. :) Я никогда не использовал его, и, что интересно, он даже не нашелся при поиске в документации MySQL.   -  person deceze♦    schedule 18.12.2009


Ответы (1)


Я полагаю, вы пытаетесь найти строки из таблицы Entita, которых нет в таблице Publicobjects. Предполагая, что это правильно, вот запрос SQL для MySQL, чтобы найти его:

SELECT `entita`.*
FROM `entita` 
LEFT JOIN `publicobjects` ON (`publicobjects`.`model` = 'entita' 
    AND `publicobjects`.`model_id` = `entita`.`id`)
WHERE `publicobjects`.`model_id` IS NULL

Чтобы заставить это работать с моделями CakePHP, нужно выполнить пару шагов. Я сделал некоторые предположения о названиях ваших моделей, но могу ошибаться, и это легко исправить.

Сначала добавьте это к модели Entita:

<?php
var $hasOne = array('Publicobject' => array(
    'foreignKey' => 'model_id',
    'conditions' => 'Publicobject.model = "Entita"'));

Теперь вы можете проверить записи, отсутствующие в таблице Publicobjects, следующим образом:

<?php
$this->Entita->find('all', array('conditions' => array('Publicobject.model_id IS NULL')));
person Jason    schedule 17.12.2009
comment
Я забыл учесть LEFT JOIN в своем запросе... Я использовал NOT EXISTS, это то же самое... :) Спасибо! Однако, если я хочу выбрать только «Entita», которые также находятся в «Publicobject», я должен изменить условия: «Publicobject.model_id IS NOT NULL»... :) - person Andrea F.; 17.12.2009