0

relフィールドといくつかの実用的なPHPコードを含むテーブルがid refid cellid catあり、それぞれの行数をカウントしてcellid、後で使用するために配列として返します。

<?php
// connect to database
require($DOCUMENT_ROOT . "connect.php");
// count the number of relationships for each cell id
  $cell_array = array();
  if ($result = mysqli_query($link, "SELECT cellid, COUNT(*) totalcount, cat FROM rel GROUP BY cellid")) {
    if (mysqli_num_rows($result)) {
      while ($row = mysqli_fetch_assoc($result)) {
        $cell_array[$row["cellid"]] = $row['totalcount'];
      }
    }
  }
?>

次に、関数を追加し、それぞれのモード(最も一般的な値)を計算してcatcellidその値を配列に含めます。複数のモードがある場合、またはモードがない場合は、9を返します(cat1から8の値のみを持つことができます)。

私はモードを見つける方法を読んでいますが、一般的な解決策は次のようになります。

SELECT COUNT(*) frequency, cat, cellid
FROM rel
GROUP BY cat
ORDER BY COUNT(*) DESC
LIMIT 1

しかし、これは、一般的に最も一般的なものごとに最も一般的なものを返すわけではありませcatん。cellidcat

私はサブクエリを使用して作業しています

SELECT cellid, cat, COUNT( * ) 
FROM  `rel` 
GROUP BY cellid, cat

これにより、組み合わせごとに行が生成cellid catされますが、これを使用して、それぞれのエントリの総数と、それぞれの最も一般的なエントリを見つける方法がわかりませんcellidcatcellid

編集

私はさらに進歩を遂げました、私は今、catそれぞれのモードを見つけるための作業クエリを持っていますcellid

SELECT cellid, cat
FROM rel t
GROUP BY cellid, cat
HAVING cat = ( 
SELECT cat
FROM rel
WHERE cellid = t.cellid
GROUP BY cat
ORDER BY COUNT( * ) DESC , cat
LIMIT 1 )

しかし、2つのクエリを組み合わせる方法がまだわかりません。一方からの出力は、もう一方では使用できません。

4

1 に答える 1

0

それらを結合することにより、それらを組み合わせることができます。

select cell.*, mode.cat as modecat
from (SELECT cellid, COUNT(*) totalcount
      FROM rel
      GROUP BY cellid
     ) cell join
     (SELECT cellid, cat
      FROM rel t
      GROUP BY cellid, cat
      HAVING cat = (SELECT cat
                    FROM rel
                    WHERE cellid = t.cellid
                    GROUP BY cat
                    ORDER BY COUNT( * ) DESC , cat
                    LIMIT 1
                  )
     ) mode
     on cell.cellid = mode.cnt

これは、複数の値の場合を処理しません。任意の値のみが必要な場合は、次のようにします。

select cell.*,
       (select cat
        from rel
        where cell.cellid = rel.cellid
        group by cellid, cat
        order by COUNT(*) desc
        limit 1
       ) as mode
from (SELECT cellid, COUNT(*) totalcount
      FROM rel
      GROUP BY cellid
     ) cell

マルチプルの識別は少し注意が必要です。サブクエリで追加の集計が必要です。

select cell.*,
       (select (case when min(cat) = max(cat) then min(cat) else 'MULTIPLE' end) as mode
        from (select cat, COUNT(*) as cnt
              from rel
              where cell.cellid = rel.cellid
              group by cellid, cat
             ) t
        group by cnt
        order by cnt desc
        limit 1
       ) mode
from (SELECT cellid, COUNT(*) totalcount
      FROM rel
      GROUP BY cellid
     ) cell
于 2012-10-24T19:33:23.027 に答える