mysql - 将整行复制到一个表到另一个表,并在一个查询中添加带条件的count(*)

时间:2012-03-22 00:04:54

标签: mysql count copy row

我遇到了问题。在网上看后,我没有找到解决方案。你是我最后的希望:)这就是问题所在:

我有三张桌子:

table_tmp

id | name | val | owner |
------------------------
5  | abc  | 100 | 3
6  | cde  | 200 | 4

table_ready

id | special_number | id_tmp | name_tmp | val_tmp | owner_tmp | 
---------------------------------------------------------------
1  |  0             | 1      | xyz      | 100     | 3         |
2  |  0             | 2      | zzz      | 100     | 4         |
3  |  1             | 3      | kkk      | 200     | 3         |
4  |  2             | 4      | uuu      | 130     | 3         |

现在我想将table = tmp中owner = 3的整行复制到table_ready。这很容易 - 我这样做:

INSERT INTO table_ready SELECT '', '', t.* FROM table_tmp t WHERE owner = 3;

但是我想让这个查询计算table_ready中拥有owner_tmp = 3和val_tmp = 100的所有行。 所以在查询table_ready之后会看起来像这样:

id | special_number | id_tmp | name_tmp | val_tmp | owner_tmp | 
---------------------------------------------------------------
1  |  0             | 1      | xyz      | 100     | 3         |
2  |  0             | 2      | zzz      | 100     | 4         |
3  |  1             | 3      | kkk      | 100     | 3         |
4  |  2             | 4      | uuu      | 130     | 3         |
5  |  3             | 5      | abc      | 100     | 3         |

发生什么事了? table_tmp(name,val和owner)中的值转到table_ready(name_tmp,val_tmp,owner_tmp),id自动递增,特殊数字是查询的效果:

SELECT count(id) FROM table_ready WHERE owner_tmp = 3 AND val_tmp = 100.

如何在一个查询中加入这些查询?

在写完这篇文章之后,我非常耐心地刮胡子,喝点茶,我找到了解决办法。我根本不需要加入这些查询。如果有人有上述问题的解决方案,请随意写下 - 我很乐意提高我的技能。抱歉令人不安:)

2 个答案:

答案 0 :(得分:0)

我在飞机上,所以我现在无法测试,但请尝试以下方法:

INSERT INTO table_ready SELECT '', IFNULL(r.count(distinct id),0) as special_number, t.*, 
FROM table_tmp t LEFT OUTER JOIN table_ready r ON t.owner = r.owner_temp 
WHERE t.owner = 3 and r.val_tmp = 100 GROUP BY r.owner_temp;

否则,我认为你必须使用子查询。

编辑:添加了IFNULL,不确定是否有必要。

答案 1 :(得分:0)

嗯,实际上你有一些错误,因为你说这个问题:

SELECT count(id) FROM table_ready WHERE owner_tmp = 3 AND val_tmp = 100

返回3,它实际上会根据您的数据返回1.

无论如何,这是我认为您正在寻找的查询:

INSERT INTO table_ready
  SELECT '',
    (SELECT count(*) FROM table_ready
     WHERE owner_tmp = 3 AND val_tmp = 100),
  t.* FROM table_tmp t
WHERE owner = 3;