質問: ' . $db->quote('1')) ->where($db->quotename('subcheckin') . ' in (' . $subquery->__tostring() . ')') ->order($db->quotename('ordering') . ' asc'); // set the query and load the result. $db->setquery($query); これは良い、もっともらしいアプローチのようですが、もっと良い方法はありますか?
回答: joomlaプラットフォームapiを使用してサブクエリを含むクエリを実行する方法もあります。サブクエリの使用方法に関する基本的な考え方は、 gunjanpatel に基づいています。 ネストされたセットモデル でクエリを実行する例を次に示します。sqlクエリ:-- find the immediate subordinates of a node select node.title, (count(parent.id) - (sub_tree.depth + 1)) as depth from lubd3_usergroups as node, lubd3_usergroups as parent, lubd3_usergroups as sub_parent, ( select node.id, (count(parent.id) - 1) as depth from lubd3_usergroups as node, lubd3_usergroups as parent where node.lft between parent.lft and parent.rgt and node.id = 1 group by node.id order by node.lft )as sub_tree where node.lft between parent.lft and parent.rgt and node.lft between sub_parent.lft and sub_parent.rgt and sub_parent.id = sub_tree.id group by node.id -- not showing the parent node having depth = 1 -- showing the parent node -- having depth <= 1 order by node.lft; そして、joomlaによって実行される変換されたクエリ:// create the subquery select statement. // nested set queries: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ // cross join: http://www.informit.com/articles/article.aspx?p=30875&seqnum=5 $subquery->select(array('node.id', '(count(parent.id) - 1) as depth')) ->from($db->quotename('#__usergroups') . 'node') ->join('cross', $db->quotename('#__usergroups', 'parent')) ->where($db->quotename('node.lft') . ' between ' . $db->quotename('parent.lft') . ' and ' . $db->quotename('parent.rgt') . ' and ' . $db->quotename('node.id') . ' = ' . $db->quote('1')) ->group($db->quotename('node.id')) ->order($db->quotename('node.lft')); // create the base select statement. $query->select(array('node.title', '(count(parent.id) - (sub_tree.depth + 1)) as depth')) ->from($db->quotename('#__usergroups') . 'node') ->join('cross', $db->quotename('#__usergroups', 'parent')) ->join('cross', $db->quotename('#__usergroups', 'sub_parent')) ->join('cross', '(' . $subquery .') as sub_tree') ->where($db->quotename('node.lft') . ' between ' . $db->quotename('parent.lft') . ' and ' . $db->quotename('parent.rgt') . ' and ' . $db->quotename('node.lft') . ' between ' . $db->quotename('sub_parent.lft') . ' and ' . $db->quotename('sub_parent.rgt') . ' and ' . $db->quotename('sub_parent.id') . ' = ' . $db->quotename('sub_tree.id')) ->group($db->quotename('node.id')) ->having($db->quotename('depth') . ' = ' . $db->quote('1')) ->order($db->quotename('node.lft')); // set the query and load the result. $db->setquery($query); $rowlist = $db->loadassoclist(); echo "<pre>"; print_r($rowlist); echo "</pre>";