2009-12-16 2 views
2

У меня есть 2 таблицы в моей дб ...Найти условия, как 'НЕ СУЩЕСТВУЕТ'

Entita
идентификатор INT (11)
Descrizione VARCHAR (50)
... ..

Publicobjects
....
модель 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 без использования пользовательского запроса?

Благодаря

+0

Я не думаю, что 'WHERE NOT EXISTS' является действительным (My) SQL-выражением, и я не могу представить, как бы вы выбрали несуществующие записи. Можете ли вы описать словами, что хотите? – deceze

+0

Да, это действительное выражение MySql ... см. Здесь: http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html :) –

+0

Упс, узнал что-то новый. :) Я никогда не использовал его, и интересно, что он даже не появлялся при поиске в документах MySQL. – deceze

ответ

2

Я считаю, что вы пытаетесь найти строки из таблицы 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'))); 
+0

Я забыл рассмотреть LEFT JOIN по моему запросу ... Я использовал НЕ СУЩЕСТВУЮЩИЕ, что то же самое ... :) Спасибо! Однако, если я хочу выбрать только «Entita», которые также находятся в «Publicobject», я должен изменить условия: «Publicobject.model_id IS NOT NULL» ... :) –

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