2012-12-27 252 views
3

我有一个项目表和另一个报告。每个报告都有一个外键链接到正在报告的项目。MySQL DELETE语句加入,HAVING和GROUP BY

我试图删除这个查询中显示的所有项目:

SELECT items.id, title, SUM(weight) AS total_weight, SUM(weight)*10/views AS score 
FROM items, reports 
WHERE items.id = reports.item_id 
GROUP BY items.id 
HAVING score >= 50; 

尝试这样的事:

DELETE items 
FROM (SELECT items.id, title, SUM(weight) AS total_weight, SUM(weight)*10/views AS score 
    FROM items, reports 
    WHERE items.id = reports.item_id 
    GROUP BY items.id 
    HAVING score >= 50) 
AS T; 

给我此错误消息:

ERROR 1109 (42S02): Unknown table 'items' in MULTI DELETE 

回答

4

在MySQL中,您必须小心子查询。我认为以下工作:

DELETE FROM items 
WHERE id IN (select * 
      from (SELECT items.id 
        FROM items join reports 
         on items.id = reports.item_id 
        GROUP BY items.id 
        HAVING SUM(weight)*10/views >= 50 
       ) 
      ) 

它使技巧编译器通过使用额外的子查询接受查询。我还修复了您的join语法。

以下,虽然,改写查询转换为更通用的语法,使用一个相关子查询:

delete from items 
where exists (select r.item_id 
       from reports r 
       where r.item_id = items.item_id 
       group by r.item_id 
       having SUM(r.weight)*10/items.views >= 50 
      ) 

这是猜测,weightviews在前面来自reports. Otherwise, you need to put the items`别名来代替。

+0

谢谢,戈登。权重来报告,但意见与项目。你的意思是把项目别名在前? – mukama

+0

谢谢戈登。非常翔实的答案,但由于某种原因没有执行。@var ___的答案为我工作。再次感谢。 – mukama

4
DELETE FROM items 
WHERE 
    id IN (
    SELECT 
     items.id 
    FROM items, reports 
    WHERE items.id = reports.item_id 
    GROUP BY items.id 
    HAVING SUM(weight)*10/views >= 50) 
+1

嗨GolezTrol,我得到这个错误:ERROR 1093(HY000):不能在FROM子句指定 – mukama

+0

目标表 '项目' 的更新显然MySQL不会接受这个。请尝试Gordon Linoff的答案。 – GolezTrol

2

我相信你的delete声明是错误的。它应该是delete from tablename where [condition]

DELETE FROM items 
    WHERE 
     id IN (
     Select T.id from (SELECT items.id, title, SUM(weight) AS total_weight, SUM(weight)*10/views AS score 
FROM items, reports 
WHERE items.id = reports.item_id 
GROUP BY items.id 
HAVING score >= 50) T) 
+0

嗯...试了一下,但我得到这个错误:错误1064(42000):你的SQL语法错误; (SELECT items.id,title,SUM(weight)AS total_weight,SUM(weight)* 10/views AS sc'at line 1 – mukama

+0

显然MySQL – GolezTrol

+0

@mcaesar我再次更新了查询,请再次查询。 – Ravi

1

试试这个:

DELETE FROM items 
WHERE id IN (SELECT id 
      FROM (SELECT i.id itemId, (SUM(weight) * 10/views) score 
        FROM items i INNER JOIN reports r ON i.id = r.item_id 
        GROUP BY itemId HAVING score >= 50 
       ) AS A 
      ); 
+0

谢谢萨哈什。var___的答案很好。得到错误:错误1054(42S22):'组声明'中的未知列'items.id' – mukama

+0

@mcaesar检查我更新的答案 –

+0

我去了错误说:错误1054(42S22):在'having子句'中的未知列'views' – mukama