随机选择,但每个名称都应至少选择一次
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 个信号。根据您的描述,这似乎是您所需要的。如果您可以发布一些表声明和测试数据(输入数据和您希望为该输入数据返回的内容),我可能会想出更好的东西以上是关于随机选择,但每个名称都应至少选择一次的主要内容,如果未能解决你的问题,请参考以下文章