我试图从Joomla的数据库中获取结果,但我需要在其他内容中嵌套一个select
。
我想获得这样的查询结果:
SELECT ...
FROM ...
JOIN
(SELECT ...
FROM ...
WHERE ...)
ON ...
但使用Joomla!查询对象
$query->select('...')
->from('...')
->join('INNER', '????? ON ...');
应该代替?????
?
答案 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
时遇到同样疑问的任何人都有帮助。