0

これは私のタグテーブルです:

post_id   tag        topic
  1      picture   entertainment
  1      camera    entertainment
  1      mobile    technology
  2      cable     technology

これは今の私のSQLです(Zend Frameworkを使用):

   $select = $db->select();
   $select->from(array('t' => 'tags'), array('count(*)', 't.topic'))
   ->joinInner(array('p' => 'posts'),'p.post_id = t.post_id')
   ->where('p.status = ?', self::STATUS_LIVE)
   ->where('t.topic= ?', $options);

   return $db->fetchOne($select);

IDごとに1つだけ選択して、トピックを数えたい。この場合、次のようになります。

entertainment: 1
technology: 2

今の私の結果は次のとおりです。

entertainment: 2
technology: 2

これが解決策です:

$select = $db->select();
$select->from(array('t' => new Zend_Db_Expr('(SELECT post_id,topic FROM tags group by post_id,topic)')), array('count(*)', 't.topic'))
->joinInner(array('p' => 'posts'), 'p.post_id = t.post_id', array())
->where('p.status = ?', self::STATUS_LIVE)
->where('t.topic= ?', $options)
->group("t.topic");

return $db->fetchOne($select);
4

1 に答える 1

0

このクエリを使用できます:

SELECT COUNT(*),topic FROM (SELECT post_id,topic FROM tags GROUP BY post_id,topic) t GROUP BY topic;

zendでの同じクエリ:

$select = $db->select();
$select->from(array('t' => new Zend_Db_Expr('(SELECT post_id,topic FROM tags group by post_id,topic)')), array('count(*)', 't.topic'))
       ->group("t.topic");

$db->fetchAll($select);
于 2013-01-05T01:43:54.330 に答える