Drupal db_select - 如何正确地组合UNION和LIMIT?

时间:2013-06-05 15:34:24

标签: database drupal-7 limit union

我试图从数据库中获取按类别划分的内容。我想要最多4个类型"人员"和其他三个类型"组织"。

我试着这样做:

    $query = db_select('node', 'n')
    ->fields('n', array('title','type'))
    ->fields('i', array('field_image_fid'))
    ->fields('f', array('uri'))
    ->condition('n.title', '%'. db_like($keys) . '%', 'LIKE')
    ->condition('type', array('people'))
    ->range(0,4);
    $query->leftJoin('field_data_field_image', 'i', 'i.entity_id = n.nid');
    $query->leftJoin('file_managed', 'f', 'f.fid = i.field_image_fid');

    $query2 = db_select('node', 'n')
    ->fields('n', array('title','type'))
    ->fields('i', array('field_image_fid'))
    ->fields('f', array('uri'))
    ->condition('n.title', '%'. db_like($keys) . '%', 'LIKE')
    ->condition('type', array('organization'))
    ->range(0,4);
    $query2->leftJoin('field_data_field_image', 'i', 'i.entity_id = n.nid');
    $query2->leftJoin('file_managed', 'f', 'f.fid = i.field_image_fid');

    $query->union($query2, 'UNION');
    $result = $query
    ->execute();

问题是此查询仅返回前三次出现的人员或组织。因此,如果查询返回了三个人,我将无法看到任何组织。

我也试过这样的事情:

$query = db_query('

        SELECT p.title,p.type 
            FROM node as p
            WHERE p.type = :type 
            LIMIT 4'
        , array(':type' => 'people',':type1' => 'organization'))->fetchAll();

$query2 = db_query('

        SELECT o.title,o.type 
            FROM node as o
            WHERE o.type = :type1 
            LIMIT 4'
        , array(':type' => 'people',':type1' => 'organization'))->fetchAll();


$query->union($query2, 'UNION');

或者像这样:

$result = db_query('

        SELECT title,type 
            FROM {node} 
            WHERE type = :type 
            LIMIT 4 
        UNION ALL
        SELECT title,type 
            FROM {node} 
            WHERE type = :type1 
            LIMIT 4'
        , array(':type' => 'people',':type1' => 'organization'))->fetchAll();

但是这两种方法只返回4人而没有组织,我的意思是永远不会......

谢谢你能提供帮助!

1 个答案:

答案 0 :(得分:1)

查询中的Union语句实际从第一个查询获取记录并将第一个查询的结果记录合并到第二个查询结果记录。

例如,第一种情况在联合查询中没有使用限制给出所有记录。

 $query1 = db_select('node', 'n')
   ->fields('n', array('nid','title','type'))
   ->condition('type', array('people'));

 $query2 = db_select('node', 'n')
  ->fields('n', array('nid','title','type'))
  ->condition('type', array('organization'));

 $query = Database::getConnection()
    ->select($query1->union($query2))
    ->fields(NULL, array('nid','title', 'type'))
    ->orderBy('nid');           
 $result = $query->execute()->fetchAll();

从上面的查询中,它从第一个查询的记录中获取第二个查询记录之前的记录

根据您的示例如果您想从人们的内容类型中获取4条记录,而从组织内容类型中获取3条记录 使用以下查询来解决您的问题

  $query1 = db_select('node', 'n')
   ->fields('n', array('nid','title','type'))
   ->condition('type', array('people'))
   ->range(0,4);
  $query2 = db_select('node', 'n')
  ->fields('n', array('nid','title','type'))
  ->condition('type', array('organization'));
  ->range(0,7);
 $query = Database::getConnection()
    ->select($query1->union($query2))
    ->fields(NULL, array('nid','title', 'type'))
    ->orderBy('nid');           
 $result = $query->execute()->fetchAll();