【问题标题】:Joomla! 3.2 - select from table joined with result of other selectJoomla! 3.2 - 从与其他选择结果连接的表中选择
【发布时间】:2014-02-16 11:28:58
【问题描述】:

我正在尝试从 Joomla 中的数据库中获取结果,但我需要在另一个中嵌套一个 select。 我想得到这样的查询结果:

SELECT ...
FROM ...
JOIN
   (SELECT ...
   FROM ...
   WHERE ...)
ON ...

但使用 Joomla!查询对象

$query->select('...')
   ->from('...')
   ->join('INNER', '????? ON ...');

应该用什么代替?????

【问题讨论】:

  • 是的,我已经读过了,但我看不到问题的答案。你能告诉我在哪里可以看到答案吗?
  • 如果您查看this,您将看到查询的INNER 部分在$db->quoteName('#__users', 'b') 之前包含$db->quoteName('#__users', 'b')
  • 这不是我的问题的解决方案。我需要将SELECT 查询代替您引用的示例中的$db->quoteName('#__users', 'b')。原始 sql 语句应该可以工作,但我想使用查询对象来制作独立于 DBMS 的代码。
  • 从同一个 dbo 创建一个单独的查询实例 ... $query2 ... 设置该查询,他们使用您设置为等于另一个变量的 __toString .. 然后将该字符串添加到里面括号。请记住,您所做的只是构建一个长字符串作为您的查询,因此您可以从您创建的不同部分构建它。

标签: database joomla joomla3.2


【解决方案1】:

你想join还是union

  • Join 将表格添加到结果集中以从中提取一些记录,即将列添加到结果中
  • Union 将具有相同列数的两个查询的结果相加,即在结果中添加行

此术语适用于 Joomla 中的 sql。

$query1->select('somefield')
   ->from('sometable')

$query2->select('somefield')
   ->from('anothertable')
   ->union($query1);

union 也支持另一种语法:

$query->union('SELECT name FROM #__foo')

$query->union(array('SELECT name FROM #__foo',
    'SELECT name FROM #__bar'))

还可以查看unionDistinct 方法,它可能会有所帮助。

如果要加入,语法为:

$query->select(array('a.field1','b.field2'))->from('table1 AS a')->join('inner','table2 as b')

你有速记方法:

  • $query->innerJoin()
  • $query->leftJoin()
  • $query->outerJoin()
  • $query->rightJoin()

【讨论】:

  • 我想join
【解决方案2】:

来晚了,但我遇到了同样的问题并以不同的方式解决了它:在查询的JOIN 部分,我插入了另一个带有另一个句柄的查询。如果我需要运行的查询类似于

    SELECT
        st.*, m.measures
    FROM tbl_stations st
    INNER JOIN (
        SELECT
            station_id, count(*) AS measures
        FROM tbl_measures
        GROUP BY station_id
    ) m ON m.station_id = st.id

然后我为两个查询元素创建句柄

$query = $db->getQuery(true);
$innerSelect = $db->getQuery(true);

然后我创建查询的 joomla 部分:

$query
    ->select(array('st.*', 'm.measures'))
    ->from($db->quoteName('#__stations', 'st'))
    //here starts the inner join part (note the opening parenthesis)
    ->innerJoin('(' . 
        //I perform a canonical select using the second handle
        $innerSelect
        ->select($db->quoteName('station_id'))
        ->select('count(*) as measures')
        ->from($db->quoteName('#__measures'))
        ->group($db->quoteName('station_id'))
       //after closing the parenthesis I put an alias for the join
       //and then I have the "ON" clause of the join
    . ') ' . $db->quoteName('m') . ' ON ' . $db->quoteName('m.station_id') . ' = ' . $db->quoteName('st.id'))
;

就是这样。最终的查询(顺便说一下,你可以使用$query->dump()的方法回显它)如下

SELECT st.*,m.measures
FROM `tbl__stations` AS `st`
INNER JOIN (
SELECT `station_id`,count(*) as measures
FROM `tbl__measures`
GROUP BY `station_id`) `m` ON `m`.`station_id` = `st`.`id`

希望这对路过的任何人都有帮助,对在JOINs 中使用SELECT 有同样的疑问。

【讨论】:

  • 它应该可以按我的意愿工作,但它声称 Joomla 的 SQL 很差。使用原始 SQL 查询比构建这些对象要容易得多,而且(我不确定)我认为这是两个查询,所以它会对 DB 执行两个请求,在原始 SQL 中,我们可以构建非常复杂的查询,它会“询问”仅 DB 一次。
  • @kampro:完全正确,这只是关于如何构建复杂查询的一个想法。不要忘记您可以使用自己的纯 SQL 复杂查询,然后使用常见的 Joomla 函数执行它:$db->execute($myPlainSqlQueryInAString);。如果您感到高兴,您甚至可以在构建查询时使用 Joomla 的 quote/quoteName 函数来转义列名和值 ^^
猜你喜欢
  • 2014-04-24
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多