簡體   English   中英

MySQL更新查詢與內部表聯接

[英]Mysql update query with inner table join

我在mysql中有更新查詢問題。 當我嘗試這個

update planned_expense p1 
set deleted=1 
where case_id=204 
  and deleted =0  
  and type='MONTHLY' 
  and planned_date>='2017-04-01'  
  and id > (select min(id) from planned_expense p2 where 
             p2.case_id = p1.case_id 
               and  p2.planned_date = p1.planned_date 
               and  p2.account = p1.account 
               and p2.type = p1.type and p2.deleted = 0)

我懂了

您不能在FROM子句中指定目標表“ p1”進行更新

當我嘗試

update planned_expense p1  
set deleted=1 
where case_id=204 
and deleted =0   
and type='MONTHLY'  
and planned_date>='2017-04-01'   
and id > (select min(id)  
    from (select * from planned_expense p2  
    where p2.case_id=p1.case_id and   
    p2.planned_date=p1.planned_date  
    and p2.account=p1.account and p2.type=p1.type and p2.deleted=0) p3)

我懂了

“ where子句”中的未知列“ p1.case_id”

我應該寫些什么來更新那些記錄? 謝謝你

這是我的桌子

DROP TABLE IF EXISTS `bes-ers`.`planned_expense`;
CREATE TABLE  `bes-ers`.`planned_expense` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `case_id` bigint(20) DEFAULT NULL,
  `deleted` tinyint(1) DEFAULT '0',
  `planned_date` datetime DEFAULT NULL,
  `addition_mark` int(11) DEFAULT NULL,
  `code` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `planned_amount` decimal(22,4) DEFAULT NULL,
  `account` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `search_field` varchar(4096) COLLATE utf8_unicode_ci DEFAULT NULL,
  `description` varchar(4096) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_by_id` bigint(20) DEFAULT NULL,
  `locked` tinyint(4) DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `FK_planned_expenses_1` (`case_id`),
  KEY `FK_planned_expenses_created_by_id` (`created_by_id`),
  KEY `planned_expense_planned_date` (`planned_date`),
  KEY `planned_expense_type` (`type`),
  KEY `planned_expense_deleted` (`deleted`),
  CONSTRAINT `FK_planned_expenses_1` FOREIGN KEY (`case_id`) REFERENCES `bankruptcy_case` (`ID`) ON DELETE SET NULL ON UPDATE SET NULL,
  CONSTRAINT `FK_planned_expenses_created_by_id` FOREIGN KEY (`created_by_id`) REFERENCES `user` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=13172954 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

如果select中涉及到MySQL,則不允許更新表,但是可以使用dinamica select表來避免此問題,例如:

    update planned_expense 
      set deleted=1 
      where case_id=204 
      and deleted =0  
      and type='MONTHLY' 
      and planned_date>='2017-04-01'  
      and id > ( select t.min_id from (select min(id)  min_id 
                from planned_expense p2 
                INNER JOIN planned_expense p1 on p2.case_id=p1.case_id 
                        and  p2.planned_date=p1.planned_date 
                    and p2.account=p1.account 
                    and p2.type=p1.type and p2.deleted=0) t ) 

嘗試添加一個復合索引為

create index idx_test on planned_expense (case_id, planned_date, account)

如@scaisEdge所述,您必須使用聯接並加快查詢速度,
嘗試根據where子句創建一個組合鍵。
就像是:
KEY case_id_deleted_type_planned_date_id(case_id,已刪除,類型,計划日期,id)
使用解釋檢查查詢是否使用了正確的索引。

謝謝大家,我通過創建臨時表而不是使用它來完成了我想做的事情。

感謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM