【问题标题】:Select records randomly and different from previously selected records随机选择记录,与先前选择的记录不同
【发布时间】:2018-09-07 07:59:51
【问题描述】:

我有一个包含 8,000 条记录的表,我想从该表中随机选择一些记录(例如 10 条)。这些记录必须不同于之前选择的记录。

以这个查询为例,我选择了一些问题:

SELECT coloumn1,column2 FROM `myTable` WHERE `status`=1 AND `group`=6 ORDER BY RAND() LIMIT 0, :max

现在我怎样才能随机选择新记录,并且与之前选择的记录不同?

【问题讨论】:

  • 如此有效地你想选择 10 条随机记录但不包括之前选择的任何相同记录?
  • 可以,但记录可以是 10 条或更多。

标签: php mysql api mysqli pdo


【解决方案1】:

您只需存储先前选择的记录的 ID,然后像下面这样添加到您的下一个查询中,以避免选择它们两次:

WHERE id NOT IN = (list of ids)

根据你的例子:

SELECT coloumn1,column2 FROM `myTable` WHERE `status`=1 AND `group`=6 AND id NOT IN (_IDS_) ORDER BY RAND() LIMIT 0

【讨论】:

  • 在这种情况下,如果我们在此查询之前有 7,000 条选定记录,我们必须在“(ID)”部分添加 7,000 个 id。这不是太慢了吗?
  • 您可以将已经选择的 id 存储在某个临时表中,然后将 id 列表放入您可以放置​​一个子查询而不是它的列表,例如:SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM temp);
  • @Tomasz 或者只是在表中添加一个带有布尔值的列,在它被拉出后将其设置为“true”,然后在查询期间忽略任何已经将此布尔值设置为 true 的列.这样做的好处是不需要整个额外表的开销来完成这项任务。虽然使用insert 可能更快,但我不太确定
【解决方案2】:

尝试: 从myTable 其中status=1 和group=6 选择coloumn1、column2 并且coloumn1不在(id,id,id,id,ids在php中连接) ORDER BY RAND() LIMIT 0, :max

而且在选择中,最好选择一个作为该行唯一标识符的列,并将该列与 NOT IN () 一起使用

  • 避免使用 RAND(),因为它非常慢 - 最好使用 php 解决它

如果选中的记录数太多,把它们放在一个临时表中,然后使用

不在(从临时表中选择 id...)

【讨论】:

  • 在这种情况下,如果我们在此查询之前有 7,000 条选定记录,我们必须在“(ID)”部分添加 7,000 个 id。是不是太慢了?
  • 或者将选定的记录放在临时表中并使用 NOT IN (SELECT ...FROM... tmp_selected_rows WHERE..)
猜你喜欢
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
相关资源
最近更新 更多