【问题标题】:How to SELECT a random row in a MySQL Database?如何在 MySQL 数据库中选择随机行?
【发布时间】:2018-03-16 18:40:40
【问题描述】:

我正在尝试从我的数据库中的列中选择一个随机行。

我需要查询来搜索/确保选择的随机行不等于存储在其他两列中的任何值。

例子:

数据库名称:数据库名称

TABLE1 包含一列:male_id

TABLE2 包含两列:number_list1 和 number_list2

我需要一个查询,它会在 male_id 列中找到一个在 number_list1 或 number_list2 中找不到的随机数。有没有办法做到这一点?这是我最好的尝试(导致错误):

SELECT male_id FROM TABLE1 WHERE male_id IS NOT (SELECT number_list1 FROM TABLE2) 
AND (SELECT number_list2 FROM TABLE2) ORDER BY RAND()

【问题讨论】:

标签: mysql sql database select


【解决方案1】:

这样的事情应该可以工作。

一般来说,你真的希望避免在 mySQL 中使用子查询

SELECT male_id FROM TABLE1 t1 
  LEFT JOIN TABLE2 t2 on t1.male_id = t2.number_list1
  LEFT JOIN TABLE2 t3 on t1.male_id = t3.number_list2
where t2.number_list1 is null and t3.number_list2 is null
 ORDER BY RAND();

【讨论】:

  • 作为一般规则,没有理由避免子查询。有时它们很糟糕。有时它们很好。
  • @GordonLinoff - 不在?我很好奇,什么时候不使用子查询是一件好事?
  • 。 .我一般不会将NOT IN 与子查询一起使用。
【解决方案2】:

您正在寻找NOT IN(或NOT EXISTS)。假设子查询中没有一个值是NULL,你可以这样做:

SELECT t1.male_id
FROM TABLE1 t1
WHERE t1.male_id NOT IN (SELECT t2.number_list1 FROM TABLE2 t2) AND
      t1.male_id NOT IN (SELECT t2.number_list2 FROM TABLE2 t2)
ORDER BY RAND()
LIMIT 1;

由于种种原因,我更喜欢NOT EXISTS

SELECT t1.male_id
FROM TABLE1 t1
WHERE NOT EXISTS (SELECT 1 FROM TABLE2 t2 WHERE t2.number_list1 = t1.male_id) AND
      NOT EXISTS (SELECT 1 FROM TABLE2 t2 WHERE t2.number_list2 = t1.male_id)
ORDER BY RAND()
LIMIT 1;

为了提高性能,您需要在 TABLE2(number_list1)TABLE2(number_list2) 上建立索引。

【讨论】:

    【解决方案3】:

    试试这个:

    SELECT male_id 
    FROM TABLE1 A
    WHERE NOT EXISTS
    (SELECT NULL 
       FROM TABLE2 B
       WHERE B.number_list1=A.male_id
       OR B.number_list2=A.male_id)   
    ORDER BY RAND()
    LIMIT 1;
    

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2021-07-03
      • 2010-11-19
      • 2018-04-03
      • 2011-10-24
      • 1970-01-01
      相关资源
      最近更新 更多