AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 54015
Accepted
Uchsun
Uchsun
Asked: 2013-11-27 20:38:53 +0800 CST2013-11-27 20:38:53 +0800 CST 2013-11-27 20:38:53 +0800 CST

如何将随机 ID 更新到 mysql 中的表?

  • 772

我有这样的表:

ID | City     | Prize |
----------------------------
1  |Surabaya  | HP
2  |Surabaya  | Watch 
3  |Surabaya  | Bag
4  |Semarang  |
5  |Semarang  |Watch
6  |Semarang  |
7  |Bandung   |
8  |Bandung   |
9  |Bandung   |

我的问题是如何为填写奖品列创建更新查询,其中城市 = '(已在设置中)' AND ID = 随机。

例如:我希望更新填写城市 = '万隆' 但 ID = '随机' 可能 (7,8,9)。

我希望你知道我的意思。

我非常感谢你的建议

谢谢

mysql
  • 4 4 个回答
  • 8693 Views

4 个回答

  • Voted
  1. Best Answer
    Michael - sqlbot
    2013-11-28T08:05:56+08:002013-11-28T08:05:56+08:00

    简单的解决方案是具体化标识要更新的行的查询结果,并使用标量子查询获取该结果......

    UPDATE table_name
       SET prize = 'Watch'
     WHERE id = (SELECT * 
                   FROM ( SELECT id 
                            FROM table_name 
                           WHERE City = 'Bandung' 
                             AND (Prize != 'Watch' OR Prize IS NULL)
                           ORDER BY RAND()
                           LIMIT 1 ) dt1
                 );
    

    这会从所需的一组行中从表中选择一个随机 id,将其具体化为具有别名“dt1”的派生表,其中包含一行和一列(新获胜者的 id),然后使用子查询选择该 id并在外部 where 子句中使用它来更新行。

    除非每个人都已经拥有一块手表,否则 0 行不会受到影响,因为我们从潜在获胜者列表中选择了“随机优先”的 id。

    • 3
  2. Praveen Prasannan
    2013-11-28T00:41:40+08:002013-11-28T00:41:40+08:00
    update Table1 t1
    Inner join
    (Select * from Table1 where City = 'Bandung' 
     Order by Rand()limit 1) t2
    on t1.ID = t2.ID
    Set t1.Prize = 'Watch';
    

    样品小提琴

    • 1
  3. cakyus
    2013-11-27T20:52:50+08:002013-11-27T20:52:50+08:00
    UPDATE table-name SET Prize = "Watch" 
        WHERE City = "Bandung" 
        AND ID = ROUND((9-7)*RAND()) + 7
    
    • 0
  4. Adrian Sullivan
    2013-11-27T21:55:14+08:002013-11-27T21:55:14+08:00

    您只想一次更新 1 个值,对吗?

    为了更新现有值,您需要生成一个包含可能值和可选值的表,类似于我添加到@table 中的计数器。原因是您可能并不总是有没有奖品的连续 ID。以“三宝垄”为例。所以我们使用 IDENTITY 强制一个序列。

    然后,我们将针对 IDENTITY 列选择一个随机数,以便始终选择现有值。

    DECLARE @prizetable TABLE (ID INT, City VARCHAR(50), Prize VARCHAR(50));
    INSERT INTO @prizetable VALUES
    (1,'Surabaya', 'HP'),(2,'Surabaya', 'Watch' )
    ,(3,'Surabaya', 'Bag'),(4,'Semarang','')
    ,(5,'Semarang','Watch'),(6,'Semarang','')
    ,(7,'Bandung',''),(8,'Bandung','')
    ,(9,'Bandung',''),(10,'Bandung','')
    ,(11,'Bandung',''),(12,'Bandung',''),(13,'Bandung','');
    
    DECLARE @CityToDo VARCHAR(50) = 'Bandung';
    /*Lets do a driver table, adding a counter so that you can do a RAND select against existing numbers*/
    DECLARE @needsprize TABLE (Counter INT IDENTITY(0,1), ID INT);
    INSERT INTO @needsprize
    SELECT p.ID
    FROM @prizetable p
    WHERE (p.Prize IS NULL OR LEN(p.Prize) < 1)
    AND City = @CityToDo;
    
    /*This will give your RAND a ceiling, else you will update nothing most of the time*/
    DECLARE @RANDceiling INT = (SELECT MAX(Counter) FROM @needsprize);
    DECLARE @RANDnumber INT = (SELECT ROUND(RAND ()*(@RANDceiling) ,0));
    
    UPDATE p
    SET p.Prize ='Watch This'
    FROM @prizetable p
    INNER JOIN @needsprize np ON np.ID = p.ID 
    WHERE (p.Prize IS NULL OR LEN(p.Prize) < 1)
    AND City = @CityToDo
    AND np.Counter = @RANDnumber;
    
    SELECT * 
    FROM @prizetable
    

    编辑

    没有简单的功能可以满足您的需求,除非您始终不介意(0 行受影响) 。

    让我再解释一下。您想为此查看“三宝垄”。

    ID  City        Prize
    4   Semarang    
    5   Semarang    Watch
    6   Semarang    
    

    您需要查看 ID 4 和 6 才能获得奖品。5已经有奖了。

    您SELECT RANDOM NUMBER它返回 157862,由于数字超出范围,因此不会进行更新。

    您选择 RANDBETWEEN 4 和 6它返回 5,不会进行更新。

    因此,现在您获取需要更新的 ID,并向它们添加序列号。所以让我们直接更新,你仍然需要某种类型的临时表,所以让我们使用 CTE

    /*This will simulate your table*/
    DECLARE @prizetable TABLE (ID INT, City VARCHAR(50), Prize VARCHAR(50));
    INSERT INTO @prizetable VALUES
    (1,'Surabaya', 'HP'),(2,'Surabaya', 'Watch' )
    ,(3,'Surabaya', 'Bag'),(4,'Semarang','')
    ,(5,'Semarang','Watch'),(6,'Semarang','')
    ,(7,'Bandung',''),(8,'Bandung','')
    ,(9,'Bandung',''),(10,'Bandung','')
    ,(11,'Bandung',''),(12,'Bandung',''),(13,'Bandung','');
    
    DECLARE @CityToDo VARCHAR(50) = 'Bandung';
    
    
    WITH TempPrizeTable AS
    (
        SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) AS RowNumber, p.ID
        FROM @prizetable p
        WHERE (p.Prize IS NULL OR LEN(p.Prize) < 1)
        AND City = @CityToDo
    ) 
    UPDATE p
    SET p.Prize ='Watch This'
    FROM @prizetable p
    INNER JOIN TempPrizeTable tp ON tp.ID = p.ID
    WHERE tp.RowNumber = (SELECT ROUND(RAND ()*(SELECT COUNT(*) FROM TempPrizeTable),0));
    
    SELECT * FROM @prizetable
    
    • 0

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve