Mysql在查询中使用count

时间:2013-12-11 14:36:31

标签: mysql sql

假设我有两个表T和T1

Ť

id   p   o 
 1    47  1
 2    48  2
 3    49  25

T1

     id   p   o 
     1    47  1
     2    42  2
     3    47  25

如果count(T1.p)>1

,我希望将T1中的行插入T.

Ť

   id   p   o 
     1    47  1
     2    48  2
     3    49  25
     1    47  1
     3    47  25

我尝试了以下查询,但它无法正常工作

insert into T(id , p,o)(SELECT T1.id , T1.p1,T1.l FROM T1 
                        where SELECT count(*) FROM t1 
                        GROUP BY t1.p 
                        HAVING COUNT(*)>1)

了解更多details。 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

insert into T SELECT T1.id , T1.p1,T1.l FROM T1 
GROUP BY t1.p1 
HAVING COUNT(t1.p1)>1

http://www.sqlfiddle.com/#!2/75c8e/1

在左侧使用dml

答案 1 :(得分:1)

您的选择中有几处错误。

这应该让你前进:

SELECT T1.id , T1.p1,T1.l 
                         FROM t1 
                        GROUP BY t1.p1 
                        HAVING COUNT(*)>1

SQL Fiddle

编辑:更新了SQL小提琴以包含插入。

答案 2 :(得分:1)

要将这些值输入T,您必须找出他们在T1中的身份并再次使用T1加入他们,以获得正确的行数:

INSERT INTO T (id, p, o)
SELECT TT.*
FROM T1 TT
INNER JOIN (
  SELECT id, p1, l
  FROM T1
  GROUP BY p1
  HAVING COUNT(*) > 1
  ) a ON a.p1 = TT.p1;

sqlfiddle demo

这是如何运作的:

SELECT id, p1, l
FROM T1
GROUP BY p1
HAVING COUNT(*) > 1

返回表中多次出现的p1。这将返回p1 = 47. GROUP BY p1 HAVING COUNT(*) > 1确保对于每个p1,我们只希望结果出现多次。

然后,我们再次使用T1进行内部JOIN,以获得所有具有P1 = 47的行:

ID  P1  L
1   47  1
3   47  25

然后,您只需将此结果插入目标表。

答案 3 :(得分:1)

以下SQL应该按照您的要求执行:

INSERT INTO T (id, p, o)
SELECT id, p1, l
FROM T1
WHERE p1 IN (
  SELECT p1
  FROM T1
  GROUP BY p1
  HAVING COUNT(*) > 1
);

SQL Fiddle - Final result