2013-11-20 69 views
1

任何人都可以展示如何與jDatabase query對象進行聯合?Joomla 3.1 JDatabase聯合查詢

的功能看起來是在的Joomla,我只是找不到任何文檔與工作的例子...

我想實現通常是這樣的純文本查詢:

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

編輯 - 我已經試過這樣:

$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服務器版本的手冊,以便在第1行的「LIMIT 0,15」附近使用正確的語法SQL = LIMIT 0,15 SQL ='

+0

你能提供你的2個數據庫查詢的例子嗎? – Lodder

回答

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)並將其連接到query1來工作。

所以這裏有一個例子,它會給你所有文章和網頁鏈接標題和別名的列表。

 
    $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服務器版本相對應的手冊,以便在第1行'LIMIT 0,15'附近使用正確的語法SQL = LIMIT 0,15 SQL =' – mousebat

+0

您必須在$ query的第一部分中添加第二部分部分使用 - > union() ie $ query-> select('name') - > from('#__ sometable') - > union(array('some query here')); – Elin

1

不要混淆UNION與JOIN

「UNION用於將結果從多個SELECT語句合併成一個結果集。」 UNION Syntax

所以首先你需要了解你是否需要一個JOIN或一個UNION。

如何使用UNION中的Joomla

據統計(檢查的Joomla代碼基)UNION並不像一個JOIN廣泛​​使用。

基本上Joomla確實在JDatabaseQuery類中提供了至少兩種方法。 unionunionAll。不幸的是,我無法爲您提供實際可行的查詢。

在CMS中使用它的唯一組件是com_finder索引器,如果您想研究它。

不要怕普通的舊的查詢,如果你真的需要它們

在使用JDatabaseQuery確實提供了一種簡單的方法來構建查詢,也使他們有多個數據庫驅動程序兼容,沒有什麼錯如果你需要的話,自己編寫查詢,特別是如果你只需要MySQL的支持。

JDatabase & Co有許多很酷的功能,但絕不是完美的。他們解決了99%的查詢需求。有些情況下,您需要更復雜的表達式,而這些表達式不包含在其中。

最後,給予數據庫引擎的查詢仍然是查詢,無論它是如何構建的。

+0

感謝Vanetin - 我檢查了union和unionAll的東西,但是當我嘗試使用它們時,它只是borks。錯誤跟蹤器上有很多關於它們被破壞的東西,但我不知道它們是否正確。我絕對需要聯盟而不是聯盟,因爲沒有聯盟的領域,我只是希望類似的領域堆疊在一起。 – mousebat

+0

THey實際上是正確的(閱讀單元測試爲您提供瞭如何使用它們的最佳示例),但它們不像其他SQL語句那樣,它們在完整查詢上運行。在舊的平臺跟蹤器中有一些例子,因爲它們被用在早期版本的標籤中。 – Elin

+0

查看示例查詢的答案更新。 – Elin