Joomla 3.1 JDatabase Union Query

时间:2013-11-20 11:56:22

标签: mysql database joomla union joomla3.1

是否有人能够展示如何与jDatabase query对象建立联合?

功能看起来在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 ='

4 个答案:

答案 0 :(得分: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语句放在一起,所以它比仅向第一个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);

答案 1 :(得分:1)

不要将UNION与JOIN混淆

“UNION用于将多个SELECT语句的结果合并到一个结果集中。” UNION Syntax

首先,您需要了解是否需要JOIN或UNION。

如何在Joomla中使用UNION

从统计上来说(检查Joomla代码库)UNION并没有像JOIN那样被广泛使用。

基本上Joomla确实在JDatabaseQuery类上提供了至少两种方法。 unionunionAll。不幸的是,我无法为您提供实际有效的查询。

在CMS中使用它的唯一组件是com_finder索引器,如果你想学习它。

如果你真的需要它们,不要害怕普通的查询

虽然使用JDatabaseQuery确实提供了一种简单的方法来构建查询并使它们与多个数据库驱动程序兼容,但是如果需要,自己编写查询没有任何问题,特别是如果您只需要MySQL支持

JDatabase & Co有许多很酷的功能,但绝不是完美的。它们解决了99%的查询需求。在某些情况下,您需要更复杂的表达式,而这些表达式并未被它们覆盖。

最后,给数据库引擎的查询仍然是一个查询,无论它是如何构建的。

答案 2 :(得分:0)

添加您的联合查询,如下所示。 更多关注joomla doc: -

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

答案 3 :(得分: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”的用户选择所有文章。

希望这有帮助