我有一张类似于以下内容的表格:
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,因为这是该收款人最常使用的类别。
答案 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)
的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;
答案 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, '') = ''
在那里有一些功夫隐藏在那里使它工作:外部组返回该组遇到的第一个行,这是由于最内部查询的排序将是计数最高的类别。