如何将一个字段的值更新为另一个字段中最常用的值?

时间:2013-09-04 03:15:20

标签: mysql sql-update

我有一张类似于以下内容的表格:

  

ID收款者类别
  001 Costco的杂货店
  002见的糖果
  003 Costco的修复
  005 Costco的杂货店
  006 Costco的
  007 Costco的
  008见的

在没有编程语言的帮助下使用MySQL,是否有一个查询(嵌套或不嵌套)将三个新行的类别设置为这些收款人最常用的类别?

例如,其中一个Costco记录(ID 003)将Repair作为其类别,而另外两个Costco行(ID 001和ID 005)将Grocery作为其类别。因此,期望的结果是新的Costco行(ID 006和ID 007)将设置为Grocery,因为这是该收款人最常使用的类别。

4 个答案:

答案 0 :(得分: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 = ''    

到查询的最后

答案 1 :(得分: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)

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

的Sqlfiddle

答案 2 :(得分: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;

Fiddle here

答案 3 :(得分: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, '') = ''

在那里有一些功夫隐藏在那里使它工作:外部组返回该组遇到的第一个行,这是由于最内部查询的排序将是计数最高的类别。