【问题标题】:How to make MySQL select a random winner when using INNER JOIN使用 INNER JOIN 时如何使 MySQL 随机选择获胜者
【发布时间】:2015-08-17 08:57:01
【问题描述】:
SELECT * FROM `surveys` INNER JOIN `surveyusers` ON `surveyusers`.`survID` = `surveys`.`survID` WHERE `surveyusers`.`hasWon` = 0 ORDER BY RAND();
UPDATE surveys SET winner = email;

这是一项学校作业,要求我们选择和更新调查获胜者。

我使用 PHP 来管理和显示调查,我希望 SQL 来挑选获胜者。 PHP设置survID

我想随机选择一个获胜者,并将调查表中的获胜者列设置为调查用户表中的电子邮件。但我确实有很多麻烦。

【问题讨论】:

  • 你的表架构是什么?
  • ORDER BY RAND() = 麻烦
  • @DanFromGermany 我知道,但这是一个快速的解决方案。
  • 您不应该在 MySQL 中执行逻辑部分(选择随机获胜者并分配给某物)。这不是为 MySQL 设计的,它也不是很好。

标签: php mysql join sql-order-by inner-join


【解决方案1】:

更新可以采用与 Select 相同的语法。

您可以将这两个查询合二为一。

UPDATE `surveys` `s` SET `s`.`winner` = (
    SELECT email FROM `surveyusers`
    WHERE `surveyusers`.`hasWon` = 0
    AND `survID` = 1
    ORDER BY RAND()
    LIMIT 1
) WHERE `survID` = 1;

当然,你必须从 PHP 中设置 survID。

【讨论】:

  • MySQL 只是给了我这个错误:#1093 - You can't specify target table 'surveys' for update in FROM 子句
  • @LasseNielsen 抱歉,我忘记了更新时需要复制表格。查询已更新。
  • 要么我一定很笨,要么我的 MySQL 数据库版本非常老旧。 #1221 - 错误使用 UPDATE 和 ORDER BY 是新错误。
  • @LasseNielsen 你说得对,带有 RAND 的 ORDER BY 不适用于 UPDATE,用于 UPDATE 的 ORDER BY 有点特别。我用子选择(不如连接好)恢复了对我以前方法的回答,但它适用于 rand。我还修复了您之前遇到的错误。
【解决方案2】:

您可以在 UPDATE 查询中嵌套 SELECT 查询:

UPDATE surveys SET winner = (
    SELECT `surveyusers`.email FROM `surveys` 
    INNER JOIN `surveyusers` ON `surveyusers`.`survID` = `surveys`.`survID` 
    WHERE `surveyusers`.`hasWon` = 0 ORDER BY RAND() LIMIT 1
) WHERE `survID` = xxx

其中 xxx 是要更新的调查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多