2013-11-20 7 views
1

Может ли кто-нибудь показать, как сделать объединение с объектом jDatabase query?Joomla 3.1 JDatabase Union Query

Функциональность выглядит в Joomla, я просто не могу найти любую документацию с рабочими примерами ...

запросе Я хотел добиться, как правило, выглядит в виде обычного текста:

SELECT field1,field2 FROM `#__mycomponent_table1` WHERE field1 = 0 
UNION 
SELECT field1,field2 FROM `#__mycomponent_table2` WHERE field1 = 0 

EDIT - Я попытался это:

$db = $this->getDbo(); 
$query = $db->getQuery(true); 
$query->union(array('SELECT field1,field2 FROM `#__mycomponent_table1` WHERE field1 = 0','SELECT field1,field2 FROM `#__mycomponent_table2` WHERE field1 = 0')); 

дает мне:

У вас возникла ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего MySQL-сервера, для правильного синтаксиса для использования рядом с «LIMIT 0, 15» в строке 1 SQL = LIMIT 0, 15 SQL = '

+0

можете ли вы представить пример своих двух запросов к базе данных, пожалуйста? – Lodder

+0

Соответствующий ресурс для исследователей: [Использование методов объединения в запросах базы данных] (https://docs.joomla.org/Using_the_union_methods_in_database_queries) – mickmackusa

ответ

0

Добавьте свой запрос на объединение, как показано ниже. для проводившей joomla doc: -

$db = JFactory::getDbo(); 
$query = " 
    SELECT * 
    FROM . . . "; 
$db->setQuery($query); 
$row = $db->loadObjectList(); 
+0

Это использует старые стандарты кодирования Joomla – Lodder

+0

Да - это слишком старый. Я хочу знать, как использовать '$ query-> join' ... – mousebat

0

Вы всегда можете использовать метод join() как так:

$db = JFactory::getDbo(); 
$query = $db->getQuery(true); 

$query->select($db->quoteName(array('a.*', 'b.username', 'b.name'))) 
->from($db->quoteName('#__content', 'a')) 
->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')') 
->where($db->quoteName('b.username') . ' LIKE \'a%\''); 

$db->setQuery($query); 
$rows = $db->loadObjectList(); 

Это просто пример запрос, который будет выбирать все статьи для пользователей, которые имеют имя пользователя начиная с "a".

Надеется, что это помогает

+0

Спасибо Lodder, но мне нужно выбрать как данные из нескольких таблиц - я отредактирую свой оригинальный вопрос, чтобы отразить это ... – mousebat

1

В основном JDatabaseQuery::Union работы пути добавления:

UNION (somequery) UNION (someotherquery) 

к вашим $query.

Более поздние запросы должны быть строками, которые вы можете генерировать из jdatabasequery отдельно и преобразовывать в строки. Так, другими словами, более поздние запросы в основном рассматриваются как подзапросов

->union(array('somequery','someotherquery')) 

Обновление

Хитрость в том, что запрос должен уже включать первый запрос, а затем union() добавляет дополнительные запросы к этому.

В Joomla диагностировать запросы попробовать

echo $query->dump(); 

, то вы можете увидеть, что неправильно в созданном запросе.

Очередное обновление

Кроме того, я хотел бы добавить, что вы должны понимать, что в целом JDatabaseQuery может использовать один и только один: SELECT, UPDATE, DELETE, но UNION предоставляет способ обойти это ограничение, когда речь идет о ВЫБРАТЬ , Однако, поскольку он в основном объединяет два оператора SELECT, это сложнее, чем просто добавить другое предложение к первому SELECT. То есть вы не можете связать union() В сущности, вы должны думать об этом как (query1) UNION (query2) ..вам нужны два запроса для выполнения операции.
И в основном вам нужно сделать специальную обработку, чтобы собрать две части.

Это работает, создавая строку: UNION (query2) и конкатенацию этого запроса1.

Итак, вот пример, который даст вам список всех названий и псевдонимов статей и веб-ссылок.

 
    $query = $db->getQuery(true) 
    ->select('title, alias') 
    ->from('#__content'); 
    // Clone the query, replace the FROM clause. 
    $sub = clone($query); 
    $sub->clear('from'); 
    $sub->from('#__weblinks'); 

    $subunion = $db->getQuery(true); 

    $subunion->union($sub); 
    $string = $query . ' ' . $subunion->union; 
    $db->setQuery($string); 
    $matches = $db->loadObjectList(); 
    var_dump($matches); 
+0

Я пробовал это и это не работает. '$ query = $ db-> getQuery (true); $ query-> union (array ('select xxxxx', 'select yyyyyy')); ' – mousebat

+0

Это дает мне SQL = У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «LIMIT 0, 15» в строке 1 SQL = LIMIT 0, 15 SQL = ' – mousebat

+0

. Вы должны иметь первую часть в $ query, а затем добавить вторую часть использование -> союз() ie$ query-> select ('name') -> from ('#__ sometable') -> union (array ('some query here')); – Elin

1

Не следует путать с UNION JOIN

«UNION используется для объединения результатов из несколько ЗЕЬЕСТА в одном набор результатов.» UNION Syntax

Итак, сначала вам нужно понять, нужен ли вам JOIN или UNION.

Как использовать UNION в Joomla

Статистически говоря (осматривая базовый код Joomla) UNION не так широко, как объединение.

В основном Joomla предоставляет как минимум два метода на классе JDatabaseQuery. union и unionAll. К сожалению, я не могу предоставить вам запрос, который действительно работает.

Единственный компонент, использующий его в CMS, является индексом com_finder, если вы хотите его изучить.

Не бойтесь простых старых запросов, если вам действительно нужен им

При использовании JDatabaseQuery действительно обеспечивает простой способ создания запросов, а также делает их совместимыми с несколькими драйверами база данных, нет ничего плохого в том записывая запросы самостоятельно, если вам нужно, особенно если вам нужна только поддержка MySQL.

JDatabase & Co есть много интересных функций, но отнюдь не идеальны. Они решают 99% запросов, которые у вас есть. Бывают случаи, когда вам нужны более сложные выражения, которые не покрываются ими.

В конце концов, запрос, предоставленный механизму базы данных, по-прежнему является запросом, независимо от того, как он был создан.

+0

Спасибо, Ванетин. Я проверил союз и союз. Все, но когда я пытаюсь использовать их, он просто прорывается. Есть много вещей в трекере ошибок о том, что они сломаны, но я понятия не имею, правильны ли они. Мне определенно нужен союз, а не соединение, потому что нет никакого поля, чтобы присоединиться к ним, я просто хочу, чтобы подобные поля были уложены друг на друга. – mousebat

+0

Это действительно правильно (чтение модульных тестов дает вам наилучшую иллюстрацию того, как их использовать), но они не похожи на другие операторы sql, поскольку они работают с полными запросами. В старой платформе трекера были некоторые примеры, потому что они использовались в ранней версии тегов. – Elin

+0

См. Обновление моего ответа для примерного запроса. – Elin