2

次のようなテーブルがあります。

ID PAYEE CATEGORY
001 Costco Grocery
002 See's Candy
003 Costco Repair
005 Costco Grocery
006 Costco
007 Costco
008 See's

プログラミング言語を使用せずに MySQL を使用している場合、3 つの新しい行のカテゴリをそれらの受取人が最も頻繁に使用するカテゴリに設定するクエリ (ネストされているかどうかに関係なく) はありますか?

たとえば、Costco レコードの 1 つ (ID 003) のカテゴリは修理ですが、他の 2 つの Costco 行 (ID 001 と ID 005) のカテゴリは食料品です。したがって、新しい Costco 行 (ID 006 と ID 007) が Grocery に設定されるのが望ましい結果です。これは、その受取人が最も頻繁に使用するカテゴリであるためです。

4

4 に答える 4

1

確かに..「your_table」をテーブルの名前に変更するだけです

UPDATE your_table
LEFT JOIN (SELECT payee, category 
             FROM
             (SELECT payee, category FROM your_table WHERE category != '' AND category IS NOT NULL GROUP BY payee, category ORDER BY count(*) DESC) AS tbl2
             GROUP BY payee
           ) AS tbl2 USING (payee)
SET your_table.category = tbl2.category;

これにより、修理として分類されているコストコも「食料品」に変更されます..これが必要ない場合は、次を追加します。

  WHERE your_table.category IS NULL OR your_table.category = ''    

クエリの最後まで

于 2013-09-04T03:56:21.707 に答える
0

派生テーブルの作成を繰り返さずに方法を見つけることができませんでした:

UPDATE t JOIN (
  SELECT s1.payee, s1.category FROM (
    SELECT payee, category, count(*) cat_count FROM t
    WHERE category IS NOT NULL
    GROUP BY payee, category
  ) s1
  LEFT JOIN (
    SELECT payee, category, count(*) cat_count FROM t
    WHERE category IS NOT NULL
    GROUP BY payee, category
  ) s2
  ON s1.payee = s2.payee AND s1.cat_count < s2.cat_count
  WHERE s2.cat_count IS NULL
) s
ON t.payee = s.payee
SET t.category = s.category
WHERE t.category IS NULL;

ここでフィドル

于 2013-09-04T04:07:40.513 に答える
0

mysql の複数テーブル更新を使用します。

UPDATE mytable t
JOIN (SELECT payee, category
    FROM (SELECT payee, category
        FROM mytable
        GROUP BY 1, 2
        ORDER BY count(*) desc) x
    GROUP BY 1) y
    ON y.payee = t.payee
SET t.category = y.category
WHERE ifnull(t.category, '') = ''

そこにはちょっとしたカンフーが隠れていて、それが機能します。外側の group by は、グループで最初に検出された行を返します。これは、最も内側のクエリの順序付けにより、カウントが最大のカテゴリになります。

于 2013-09-04T04:15:19.877 に答える