我有一个使用db_query()
的子查询的长查询。
到目前为止,我知道SelectQuery of D7伴随着扩展器。示例扩展程序是PagerDefault
(替换Drupal 6 pager_query()
)。
我需要我的寻呼机查询。我可以把PagerDefault
和db_query()
结合使用吗?
如果我必须使用db_select()
作为寻呼机,如何使用db_select()
实现子查询的查询?
$result = db_query("SELECT leg.*,
( SELECT COUNT(*)
FROM {field_data_field_leg}
WHERE field_leg_nid = leg.nid AND bundle = :bundle ) AS reviews
FROM
( SELECT
n.nid, n.created, title, field_from_value origin, field_to_value destination,
field_price_value price, term.name transport
FROM {node} n
JOIN {field_data_field_leg} l ON n.nid = l.field_leg_nid
JOIN {field_data_field_from} ff ON n.nid = ff.entity_id
JOIN {field_data_field_to} ft ON n.nid = ft.entity_id
JOIN {field_data_field_transport} t ON l.entity_id = t.field_transport_nid
JOIN {field_data_field_price} p ON t.entity_id = p.entity_id
JOIN {field_data_field_transport_type} ttype
ON t.field_transport_nid = ttype.entity_id
JOIN {taxonomy_term_data term} ON ttype.field_transport_type_tid = term.tid
WHERE n.type = :type
ORDER BY n.created DESC, field_price_value ASC
) AS leg
GROUP BY nid
ORDER BY created DESC",
array(':bundle'=>'review', ':type' => 'leg'));
发布于 2012-01-30 11:31:44
简单地说,子查询在db_select()
中是不可能的,寻呼机只能通过查询生成器( SelectQuery
或EntityFieldQuery
)创建。
因此,您不能使用上面的查询并利用Drupal的寻呼机系统,如果您想要上面的查询,您必须自己管理寻呼机,或者将查询重写为几个查询。
发布于 2012-02-01 14:36:41
这应该是可能的。
看看SelectQuery::countQuery(),它正在构建一个类似的查询。
基本上,您可以将一个完整的SelectQuery对象传递给db_select(),而不是表字符串。
因此,首先需要构建内部查询,然后创建另一个实例并将第一个查询传递给它。
您可能希望提供一个自定义计数查询,因为您可能可以构建一个比有两个嵌套子subqeries更快的查询。
https://drupal.stackexchange.com/questions/21051
复制相似问题