【问题标题】:Problem when trying to update the result of a specific select尝试更新特定选择的结果时出现问题
【发布时间】:2021-03-30 19:17:51
【问题描述】:

我有以下查询可以随意选择折扣产品注册。这非常有效。

SELECT * FROM products AS r1 
JOIN (SELECT CEIL(RAND() * (SELECT MAX(id) FROM products)) AS id) AS r2 
WHERE r1.id >= r2.id 
AND discount_rate <> 0 
ORDER BY r1.id ASC LIMIT 15

好的,但是我如何用信息填充这些记录。我试图表明他们能够出现在特别优惠部分。从有效的查询中,我编写了以下无效的更新查询:

UPDATE products 
SET is_special_offer=1 
WHERE IN (SELECT * FROM products AS r1 
  JOIN (SELECT CEIL(RAND() * (SELECT MAX(id) FROM products)) AS id) AS r2 
  WHERE r1.id >= r2.id 
  AND discount_rate <> 0 
  ORDER BY r1.id ASC LIMIT 15) 

错误“操作数应包含 1 列”

我不知道如何更新这些结果。有人可以帮我吗?

【问题讨论】:

    标签: mysql sql random sql-update inner-join


    【解决方案1】:

    在 MYSQL 中,您可以将 select 转换为 update,如下所示:

    update products p
    inner join (select ceil(rand() * max(id)) as id from products) p1 on p1.id >= p.id 
    set p.is_special_offer = 1
    where p.discount_rate <> 0 
    order by p.id 
    limit 15
    

    MySQL 在更新查询中确实支持orderby/limit

    【讨论】:

    • 感谢您的回答。该命令已被接受,但是,我有几个折扣率 0 的产品,并且它不会一次更新这些产品中的任何一个。始终显示为命令“0 行受影响”的答案
    • 抱歉,我只是注意到它有效,它在我运行几次后更新。关键是 RAND() 可能正在考虑“0”。让我指出该值必须从 1 开始直到最大 ID,我应该在 RAND 中做什么?
    • @gelsonalves:那就是:floor(1 + rand() * (max(id) - 1))。请参阅文档中给出的示例:dev.mysql.com/doc/refman/8.0/en/…
    • 欢迎@gelsonalves。如果我的回答正确地回答了您的问题,那么点击复选标志accept it...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多