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,是否有一个查询(嵌套或不嵌套)将三个新行的类别设置为这些收款人最常用的类别?

例如,Costco 记录之一 (ID 003) 将 Repair 作为其类别,而其他两个 Costco 行 (ID 001 和 ID 005) 将 Grocery 作为其类别。因此,期望的结果是新的 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;

这会将分类为维修的 costco 也更改为“杂货店”。如果您不想要这个,请添加:

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

到查询的最后

于 2013-09-04T03:56:21.707 回答
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 回答
0

这会起作用

UPDATE test t,
  (SELECT category,
          payee,
          count(*)
   FROM test ORDER BY count(*) desc LIMIT 1) t1
SET t.category = t1.category
WHERE t.payee = t1.payee
  AND (t.category = ''
       OR t.category IS NULL)

Sqlfiddle 在http://www.sqlfiddle.com/#!2/ed5b0/1/0

于 2013-09-04T03:59:37.483 回答
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 回答