随机选择,但每个名称都应至少选择一次

Posted

技术标签:

【中文标题】随机选择,但每个名称都应至少选择一次【英文标题】:SELECT random but every name should be selected at least once 【发布时间】:2015-11-11 14:48:25 【问题描述】:

我的 mysql 查询有问题:我有超过 100000 条记录, 我想要的只是随机选择 10 个条目,在那里我至少可以看到所有设备一次, 设备名称因用户而异。 该表有许多设备名称,名称在另一个表中,我使用设备 ID 加入该表 每个用户的设备少于 10 台,所以基本上我可以在 LIMIT 10 中看到所有设备,但随机函数有时不会选择其中一些 我用:

SELECT DISTINCT name,signal
FROM my_table
Where name='any_name'
ORDER BY RAND()LIMIt 10

这会选择 10 个条目,但有时某些设备未选择 示例:

+------------+------------+
| Device     | Signal     | 
+------------+------------+
| Router1    | -60        |  
| Router2    | -56        |
| Router3    | -102       |
| Router4    | -125       |
| .......    | ....       |
+------------+------------+

【问题讨论】:

您有多少台设备?如果您有超过 10 个条目,则不可能每台设备都只有 10 个条目。 “选定设备”是什么意思?另外,您没有为查询指定任何条件。 (没有 WHERE 子句) 怀疑你想要它的名称和信号字段之一。 DISTINCT 指的是整行,而不仅仅是名称字段。 @BrianJ : 每个用户的设备少于 10 台 GROUP BY name, device 可以帮助您特别是与MAX(signal)MIN(signal) 结合使用 【参考方案1】:

尝试使用此代码:

SELECT column_name FROM table_name ORDER BY RAND() LIMIT 10

但请确保您已按照预期设置了 column_name 和 table_name。

此外,请尝试在旁边使用此链接: http://jan.kneschke.de/projects/mysql/order-by-rand/

祝你好运。

【讨论】:

这并不能保证所有设备都会至少被选中一次【参考方案2】:

你可以试试这个(未经测试)。逻辑是选择那些信号是该设备最大的设备记录。

SELECT aa.name, aa.signal
FROM (
    SELECT name, MAX(signal) AS max_signal
    FROM my_table
    GROUP BY name
) AS _aa
INNER JOIN my_table AS aa
ON aa.name = _aa.name
WHERE aa.signal = _aa.max_signal
ORDER BY RAND()
LIMIT 10;

【讨论】:

请向我们提供包含一些示例数据的表结构,以便我们对其进行测试。【参考方案3】:

在 SELECT 上使用子查询的方式很糟糕:-

SELECT b.Device, (SELECT Signal FROM my_table a WHERE a.Device = b.Device ORDER BY RAND() LIMIT 1)
FROM 
(
    SELECT DISTINCT Device
    FROM my_table
    ORDER BY RAND()
    LIMIT 10
) b

【讨论】:

这不返回 10 行,这将返回每个设备 1 行 它随机选择 10 个设备,然后为每个设备选择 1 个信号。根据您的描述,这似乎是您所需要的。如果您可以发布一些表声明和测试数据(输入数据和您希望为该输入数据返回的内容),我可能会想出更好的东西

以上是关于随机选择,但每个名称都应至少选择一次的主要内容,如果未能解决你的问题,请参考以下文章

在随机森林中的树中的每个节点处随机选择变量

如何为所有 3 个项目都存在于选择中的 3 个项目选择 10 个随机记录

显示随机选择(Python)

[PKUWC 2018]随机游走

Loj #2542. 「PKUWC2018」随机游走

挑战:如何在随机或任意选择客户名称时列出与客户名称相关的所有信用卡