2

両方の分類用語 (tid)を共有するノードについて Drupal 7 にクエリを実行します。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番目の用語を持つノードを返す必要があります。2 つの用語のみをフィルター処理する場合の解決策は、結合を使用してクエリを実行することです。

要約すると、最初の用語で「最初のクエリ」を実行し、最初の結果の nid を使用して同じテーブルに結合し、2 番目の用語でフィルター処理する必要があります。

$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}]

これで、最終的に 2 番目の条件$results->condition('t2.tid', 2014)を追加できるようになり、次のように返されます。

[{nid: 1, tid: 2014}]
于 2014-08-20T14:46:17.703 に答える
-2

これを試して、コードを SQL クエリに変換し、PHPmyadmin または他の同様のインターフェイスで実行します。これは、クエリを作成して目的の結果を取得するための優れた方法です。

于 2013-06-19T12:15:45.227 に答える