【问题标题】:MYSQL update a row if all multiple rows that belong to the same foreign ID have same value如果属于同一外部 ID 的所有多行具有相同的值,则 MYSQL 更新一行
【发布时间】:2015-09-21 12:56:27
【问题描述】:

我有 3 个表:schedulelocationssuites

时间表的结构:schedule-id, location-id, schedule-completed-on-date

位置结构:location-idlocation-building-numberlocation-street-name

套件结构:suite-idlocation-idsuite-numbersuite-visited

许多套房可能属于同一地点。日程表的location-id 是唯一的,因此在任何时候都可能只有一个唯一的位置,不能重复。

我想将 schedule-completed-date-on 设置为一个日期,我知道该怎么做,如果日程表行位置的每个套件都有 suite-visited 等于 10- 否,1 - 是的)。

是否可以使用 MySQL,如果可以,那么怎么做?还是我必须使用服务器端语言以编程方式完成?

例如,如果我有两个位置 - 1 个 Main St. 和 2 个 Main St. - 总共 10 间套房 - 5 个属于第一个位置,其他 5 个属于第二个位置。如果 MySQL 检测到与第一个位置相关的所有 5 个套件行的 suite-visited 等于 1,则立即将 schedule-completed-on 设置为当前日期,否则不要。

手头数据和预期结果:

LOCATIONS
location-id     location-building-number    location-street-name
    1                   1                           Main St.
    2                   2                           Main St.

SUITES
suite-id    location-id     suite-number    suite-visited
    1           1               100             1
    2           1               200             0
    3           1               300             0
    4           1               400             0
    5           1               500             1
    6           2               1000            1
    7           2               1100            1
    8           2               1200            1
    9           2               1300            1
    10          2               1400            1

SCHEDULE
schedule-id     location-id     schedule-completed-on-date
    1               1                   NULL
    2               2               7/3/2015 00:00:00

// because all suites for location 2 have suite-visited set to 1
// second row under SCHEDULE gets the date set 
// because all suites belonging to
// location 2 have been visited

【问题讨论】:

  • 你能分享一些示例记录吗?
  • ... 和想要的结果
  • @Nimesh 好的。一瞬间
  • 您也许可以使用逆来实现,即如果没有记录的 site-visited =0,则使用 UPDATE 语句和 NOT EXISTS 更新记录
  • 有了这样的结构,您可以删除表 'schedule' (schedule_id = location_id) 并将列 'suite-visited-on-date' 添加到套件表中,当您更新该列时将 suite-visited 更新为 1。然后您可以检查每个位置是否有 suite-visited = 0,如果没有则选择最新日期。

标签: php mysql


【解决方案1】:

根据套件访问表的更新自动更新SCHEDULE的触发器,适当地命名触发器。

DELIMITER $$      
  CREATE TRIGGER trigger_name
  AFTER UPDATE
     ON suite-visited FOR EACH ROW      
  BEGIN      
      IF NOT EXISTS (select 1 from SUITES where suite-visited = 0 and location-id = new.location-id) THEN
          UPDATE SCHEDULE set schedule-completed-on-date = curdate() where location-id = new.location-id;
      END IF;
  END;
$$
DELIMITER ;

【讨论】:

  • 我很难理解这个查询。您尝试在 where 子句返回的数据中设置完成时间和位置 ID,该子句显示“从套件访问为 0 且位置 ID 为 1 的套件返回 1 行”?
  • 所以这是针对服务器端脚本方法的?我想知道是否有办法将它内置到 MySQL 中来监视这样的行并在满足某些条件时进行更改。
  • 那么您是在寻找在 MySQL 上调度代码执行还是使用 sql 语法来更新相关行?
  • 嗯,这就是我想知道的调度是否会比编写一个实际的 PHP 脚本更好。
  • 您可以使用 MySQL 上的 Event Scheduler 每天运行代码并使用当前日期更新行 curdate() 参考 link1, link2 如果您不想要,可以进行调度任何用户输入,它需要被执行而不会被遗忘。这个我没用过,如果符合你的要求你可以试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2016-01-17
相关资源
最近更新 更多