查询Drupal 7以获取共享两个分类术语(tid)的节点。我正在查询taxonomy_index tid和nid(并按创建的列对其进行排序)。 taxonomy_index表有一个tid列和相应的标记有该tid的nid。
我尝试了多种组合,但所有这些组合似乎要么返回标记为tid1或tid2的所有节点,要么只返回tid1。我的一些代码看起来像:
<!-- Query the taxonomy_index -->
$results = db_select('taxonomy_index', 't')
->fields('t', array('nid', 'tid'))
->distinct()
->condition('t.tid', $tids, 'IN')
->orderBy('t.created', 'DESC')
->extend('PagerDefault')
->limit(9)
->execute()
->fetchCol();
<!-- Build the pager -->
$total = db_select('taxonomy_index', 't')
->fields('t', array('nid', 'tid'))
->distinct()
->condition('t.tid', $tids, 'IN')
->countQuery()
->execute() // Execute the query
->fetchCol(); // Fetch column
$total_pager = $total[0];
pager_default_initialize($total_pager,9);
我也尝试过添加:
$query->where('t.tid = 115 AND t.tid = 210'); // Query for specific tids= 115 and 210.
有人知道解决方案吗?或者是否有一个首选的替代方案,比如建立一个新的索引表,或者在另一个包含两者的词汇表中创建一个新的tid(tid1 + tid2 = tid3)?
答案 0 :(得分:2)
你是对的,你提供的第一个例子应该返回具有第一个或第二个术语的节点。如果您只想过滤2个术语,那么解决方案就是使用连接进行查询。
总之,它应该进行第一次查询&#34;使用第一个术语,然后使用第一个结果中的nids连接到同一个表,然后在第二个术语上进行过滤。
$results = db_select('taxonomy_index', 't')
->fields('t', array('nid', 'tid'))
->condition('t.tid', $tid1); // Only take nodes with the first term.
// Now the result only contains nodes with one unique term ($tid1).
// We need all terms associated with the result nodes so we will make a left join.
// leftJoin doesn't return the query object so we can't chain it.
$results->leftJoin('taxonomy_index', 't2', 't.nid = t2.nid');
$results = $results->condition('t2.tid', $tid2)
->distinct()
->execute()
->fetchCol();
进一步解释一下这个数据:
[{nid: 1, tid: 42}, {nid: 1, tid: 2014}, {nid: 2, tid: 42}, {nid: 3, tid: 1337}]
第一个->condition('t.tid', 42)
会给出:
[{nid: 1, tid: 42}, {nid: 2, tid: 42}]
现在您无法检查此结果是否有其他$ tid,这就是我们在't.nid = t2.nid'
上进行加入的原因。它将返回有关第一个条件结果的所有信息:
[{nid: 1, tid: 42}, {nid: 1, tid: 2014}, {nid: 2, tid: 42}]
现在我们最终可以添加第二个条件$results->condition('t2.tid', 2014)
,它应该返回:
[{nid: 1, tid: 2014}]
答案 1 :(得分:-2)
尝试此操作,将代码转换为SQL查询并在PHPmyadmin或其他类似界面中执行。这是构建查询以检索所需结果的好方法!