2017-09-02 60 views
0

我已经查找过但没有找到可以在我的实例中工作的解决方案。mySQL - 使用Inner Join删除表中的行

mySQL db with 2 tables。使用表b的结果来标识要删除的表a中的行。

当我运行这个查询时,它返回表a的结果。

SELECT a.* FROM forteweb_vhatest.siteind_frm_item_metas a 
INNER JOIN (
      SELECT item_id FROM forteweb_vhatest.siteind_frm_item_metas 
      WHERE field_id = 122 
      AND ExpiryDate < now() 
      )b ON a.item_id = b.item_id ; 

我得到一个错误,当我尝试用

DELETE a.* FROM forteweb_vhatest.siteind_frm_item_metas a 
INNER JOIN (
      SELECT item_id FROM forteweb_vhatest.siteind_frm_item_metas 
      WHERE field_id = 122 
      AND ExpiryDate < now() 
      )b ON a.item_id = b.item_id ; 

删除这些记录,你能告诉我为什么吗?

谢谢。

+0

1.删除'。*'。 – Strawberry

回答

0
SELECT a.* FROM forteweb_vhatest.siteind_frm_item_metas a 
INNER JOIN (
     SELECT item_id FROM forteweb_vhatest.siteind_frm_item_metas 
     WHERE field_id = 122 
     AND ExpiryDate < now() 
     )b ON a.item_id = b.item_id ; 

/*添加表别名后删除*/

DELETE a FROM forteweb_vhatest.siteind_frm_item_metas a 
    INNER JOIN (
      SELECT item_id FROM forteweb_vhatest.siteind_frm_item_metas 
      WHERE field_id = 122 
      AND ExpiryDate < now() 
      )b ON a.item_id = b.item_id ; 
+0

嗨Ravi。这看起来很正确,但在MySQL Workbench中引发错误。 '错误代码:1064.你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行的'INNER JOIN(SELECT item_id FROM forteweb_vhatest.siteind_frm_item_met')处使用正确的语法'但是我可以说SELECT语句正常工作吗? –

+0

我刚刚复制了您的选择查询,正如我所看到的,你使用别名“b”作为第二张表,但是你没有在查询中使用表名 –

+0

感谢Ravi,它现在在工作,接下来是我为CRON安排的。我们走!:)干杯。 –

0

您应该从delete语句中删除a.*,因为delete不会在delete关键字后接受参数。

它删除表名后给出的查询返回的所有内容。如果表名后面没有任何内容,则所有记录都将被删除。

您可以检查delete语句here的语法。

希望能够澄清你的疑问:)

+0

删除接受关键字后的参数;只是不*该*参数 – Strawberry

+0

哦..是啊。只需从[本站](https://www.techonthenet.com/mysql/delete.php)在线阅读它,但根据它,它只接受3个参数。在代码查询中,你在'a。*'中期待什么? –

+0

也许这里还有别的事情要做。即使这个简单的命令失败。 'DELETE FROM forteweb_vhatest.siteind_frm_item_metas a WHERE a.item_id = 28161;'我已经在cPanel中检查了这个用户的特权,并且他们拥有了所有特权。 –