web-dev-qa-db-ja.com

複数のコンテンツタイプの最後の5つのノードをクエリする方法は?

複数のコンテンツタイプの最後の5つのノード、たとえばtypeAtypeBtypeCtypeDをクエリしたい。

元々は1つのコンテンツタイプのみでしたが、私は EntityFieldQuery を使用してそれを行いました。

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'typeA')
  ->propertyCondition('status', 1)
  ->propertyOrderBy('created', 'DESC')
  ->range(0, 5);

$result = $query->execute();

しかし、今度は他の3つのコンテンツタイプをリストに含める必要があります。

このクエリを拡張して、他の3つのコンテンツタイプの最後の5つのノードも含める方法はありますか?結果には、4つのコンテンツタイプすべてから5つの最後のノードがあり、全体で20ノードになります。

または、4つの個別のクエリでそれを行う必要がありますか?

3
Елин Й.

EntityFieldQueryの2行目を次のように変更するだけでよいと思います。

->entityCondition('bundle', array('typeA', 'typeB', 'typeC', 'typeD'), 'IN')

ただし、このテストはまだ行っていませんが、この方法で複数のコンテンツタイプをクエリできます。

乾杯

編集:多分これはあなたをもっと助けることができます: https://www.drupal.org/node/2048345

2
geodoo

次のコードのようなものを試してください:

$types= array('type1','type2','type3');

foreach ($types as $type) {
  $query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'typeA')
    ->propertyCondition('status', 1)
    ->propertyOrderBy('created', 'DESC')
    ->range(0, 5);
  $temp = $query->execute();

  if (isset($temp['node'])) {
    $result[$type]['nids'] = array_keys($temp['node']); 
    $result[$type]['nodes'] = node_load_multiple($result[$type]['nids']);
  } 
}

/// then you can load them by 
1
Yusef

他の人がUNIONの使用が1つのクエリでそれを行う最も簡単な方法になると示唆しているように、私は思います:

$nids = db_query("(SELECT nid FROM node WHERE type = 'typeA' ORDER BY changed LIMIT 0, 5)
UNION
(SELECT nid FROM node WHERE type = 'typeB' ORDER BY changed LIMIT 0, 5)
UNION
(SELECT nid FROM node WHERE type = 'typeC' ORDER BY changed LIMIT 0, 5)
UNION
(SELECT nid FROM node WHERE type = 'typeD' ORDER BY changed LIMIT 0, 5)")->fetchCol();
$nodes = node_load_multiple($nids);

私は numbered rows を使用してそれを行う方法で遊んでいましたが、最新のノードを取得しないのであきらめましたが、修正することに関心がある場合のSQLは次のとおりです。

SELECT nid, title, type, changed
FROM (
    SELECT nid, title, type, changed,
    @num := if(@group = type, @num + 1, 1) as row_number,
    @group := type as dummy
    FROM   node
    WHERE type IN ('typeA', 'typeB', 'typeC', 'typeD')
    ORDER BY type, title
) AS x
WHERE  row_number <= 5
ORDER BY type

また、この非常に関連するSO質問 MySQL:特殊タイプの最新のn行を取得する方法 も参照してください)==

0
Felix Eve