2

在 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)?

4

2 回答 2

2

你是对的,你给出的第一个例子应该返回具有第一个或第二个术语的节点。如果您只想过滤 2 个术语,解决方案是使用连接进行查询。

总之,它应该对第一个词进行“第一次查询”,然后使用第一个结果中的 nid 加入同一个表,然后过滤第二个词。

$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}]
于 2014-08-20T14:46:17.703 回答
-2

试试这个,将代码转换为 SQL 查询并在 PHPmyadmin 或其他类似界面中执行。这是构建查询以检索所需结果的好方法!

于 2013-06-19T12:15:45.227 回答