Проблема с Zend SQL Union Query - PullRequest
0 голосов
/ 07 марта 2011

У меня проблемы с выполнением запроса Union с использованием Zend Framework.

Запросы следующие:

$localizedEvents = $db->select()
                                        ->from(array("cont" => "content"))
                                        ->where("cont.contentType = ?", 'event')
                                        ->where('cont.realm = ?', 'live')
                                        ->join(array('contCat' => 'content_categories'), 'cont.id = contCat.id_content', array())
                                        ->join(array('cats' => 'categories'), 'contCat.id_category = cats.id')
                                        ->where('cats.title like ?', "%$this->keyword%")
                                        ->distinct();

            $eventsQuery = $db->select()->from(array("cont" => "content"))
                                        ->where("cont.contentType = ?", 'event')
                                        ->where('cont.content LIKE ? ', "%$termEncoded%")
                                        ->where('cont.realm = ?', 'live');

            $finalQuery = $db->select()->union(array($localizedEvents, $eventsQuery))->order('cont.publishDate DESC');

сгенерированный запрос выглядит следующим образом:

SELECT  `cont`. * ,  `cats`. * 
FROM  `content` AS  `cont` 
INNER JOIN  `content_categories` AS  `contCat` ON cont.id = contCat.id_content
INNER JOIN  `categories` AS  `cats` ON contCat.id_category = cats.id
WHERE (

cont.contentType =  'event'
)
AND (
cont.realm =  'live'
)
AND (
cats.title LIKE  '%conferência%'
)
UNION SELECT  `cont`. * 
FROM  `content` AS  `cont` 
WHERE (
cont.contentType =  'event'
)
AND (
cont.content LIKE  '%confer\\\\u00eancia%'
)
AND (
cont.realm =  'live'
)
ORDER BY  `cont`.`publishDate` DESC 
LIMIT 0 , 30

Это возвращает мне эту ошибку:

1222 - Используемые операторы SELECT имеют различное количество столбцов

Понятия не имею, что я делаю не так. Может кто-нибудь помочь мне, пожалуйста?

Требуемый SQL-запрос должен быть:

SELECT  `cont`. * 
FROM  `content` AS  `cont` 
INNER JOIN  `content_categories` AS  `contCat` ON cont.id = contCat.id_content
INNER JOIN  `categories` AS  `cats` ON contCat.id_category = cats.id
WHERE (
cont.contentType =  'event'
)
AND (
cont.realm =  'live'
)
AND (
cats.title LIKE  '%conferência%'
)
UNION SELECT  `cont`. * 
FROM  `content` AS  `cont` 
WHERE (
cont.contentType =  'event'
)
AND (
cont.content LIKE  '%confer\\\\u00eancia%'
)
AND (
cont.realm =  'live'
)
LIMIT 0 , 30

Может кто-нибудь помочь мне превратить этот запрос в Zend?

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Вы ОБЪЕДИНЯЕТЕ два запроса SELECT, но оба этих запроса должны иметь одинаковое количество столбцов.В первом запросе вы выбираете следующие поля:

`cont`. * ,  `cats`. *

Во втором запросе вы выбираете эти поля:

`cont`. *
0 голосов
/ 07 марта 2011

Вкл.

->join(array('contCat' => 'content_categories'), 'cont.id = contCat.id_content', array())
->join(array('cats' => 'categories'), 'contCat.id_category = cats.id')

Вы используете пустой массив для contCat и ни один для кошек, попробуйте добавить пустой массив и для кошек, потому что, насколько я знаю, он выберет * все иначе.

В любом случае посмотрите, как выглядит запрос.

...