【问题标题】:MySQL UPDATE WHERE IN for each listed value separately?MySQL UPDATE WHERE IN 分别为每个列出的值?
【发布时间】:2011-01-29 07:31:31
【问题描述】:

我有以下类型的 SQL:

UPDATE photo AS f 
  LEFT JOIN car AS c 
         ON f.car_id=c.car_id 
  SET f.photo_status=1
    , c.photo_count=c.photo_count+1 
  WHERE f.photo_id IN ($ids)

基本上,两个表(car & photo)是相关的。 $ids 中的列表包含唯一的照片 id,例如 (34, 87, 98, 12)。通过查询,我将该列表中每张照片的状态设置为 photo 表中的“1”,同时增加 car 表中手头汽车的照片计数。

它有效,但有一个障碍:因为列表可以包含与同一辆车相关的多个照片 ID,所以照片计数只会增加一次。如果列表中有 10 张与同一辆车相关联的照片,则 photo_count 将变为 1 .... 而我想将其增加到 10。

有没有办法通过连接让每张照片单独发生增量,而不是 MySQL 为我考虑太多?

我希望以上内容有意义。谢谢。

【问题讨论】:

    标签: mysql database join where-clause


    【解决方案1】:

    您可以通过两个查询来做到这一点:

    UPDATE car
    SET photo_count = photo_count + (
        SELECT count(*)
        FROM photos
        WHERE photo.car_id = car.car_id
        AND photo_status = 0
        AND photo_id IN ($ids)
    );
    
    UPDATE photo
    SET photo_status = 1
    WHERE photo_id IN ($ids);
    

    【讨论】:

    • 谢谢你,这可能是最简单的方法。
    【解决方案2】:

    我认为你应该做什么:

    分两步更新表格。首先在 photo 表中将状态设置为 1,然后将计数(通过使用 group by 和 count(...) )更新到 car 表。

    编辑 撤回了“幼稚的方法”,不会像 OP 正确声明的那样工作!

    【讨论】:

    • 你误解了这个问题。 $ids 包含与不同数量的不同汽车相关的多个照片 ID。将它们添加到 photo_count 根本不起作用。其次,只有循环第二个查询才能将查询一分为二,也就是说如果有40张照片,就会有1+40个查询。
    • 我明白你所说的“你误解了这个问题”是什么意思。我同意..我没有发现每辆车的计数会有所不同!尽管如此,我认为您应该考虑分两步进行:更新(重新计算)每辆车的图片数量。我应该写“更新”而不是添加,所以我更正了。
    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2016-10-14
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多