的Joomla! 3.2 - 从表中选择加入其他选择的结果

时间:2014-02-16 11:28:59

标签: database joomla joomla3.2

我试图从Joomla的数据库中获取结果,但我需要在其他内容中嵌套一个select。 我想获得这样的查询结果:

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

但使用Joomla!查询对象

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

应该代替?????

2 个答案:

答案 0 :(得分:2)

您想要join还是union

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

此术语适用于sql中的Joomla

$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()

答案 1 :(得分: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'))
;

就是这样。最后的查询(顺便说一句,您可以使用方法$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内使用JOIN时遇到同样疑问的任何人都有帮助。