1

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

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

但使用 Joomla!查询对象

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

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

4

2 回答 2

2

你想join还是union

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

该术语适用于 Joomlasql。

$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()
于 2014-02-16T16:16:12.910 回答
1

来得很晚,但我遇到了同样的问题并以不同的方式解决了它:在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'))
;

就是这个。最终查询(顺便说一句,您可以使用 method 回显它$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`

SELECT希望这对路过的任何人都有帮助,对使用inside有同样的疑问JOIN

于 2016-05-04T14:29:20.483 回答