【问题标题】:Display Sql results based on Percentages根据百分比显示 Sql 结果
【发布时间】:2018-03-04 13:38:59
【问题描述】:

大家好!我正在尝试在 SQL 中获得所需的结果。

我有一张这样的桌子

Products | Colors
******************
Bag      | Blue
Shoes    | Blue
Shirt    | Yellow
Sandal   | Yellow
Phone    | Yellow
Cotton   | Blue
Paper    | Blue
Biro     | Blue
Track    | Yellow
Pouch    | Yellow
Cap      | Yellow
Hat      | Yellow
Pants    | Blue
Bucket   | Blue
Belt     | Blue
Car      | Yellow
Socks    | Yellow

上面的行数是 20。

我想要实现的是随机显示10个结果:

在哪里: 3 行(结果的 30%)是蓝色的, 7 行(占结果的 70%)为黄色。

谢谢。很抱歉没有详细询问。

【问题讨论】:

标签: php mysql sql database mysqli


【解决方案1】:

这是一种几乎可以满足您的要求的方法。要在纯 SQL 中实现您的确切规范,涉及的内容要多得多……

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(Products VARCHAR(20) NOT NULL
,Colors VARCHAR(20) NOT NULL
,PRIMARY KEY(products,colors)
);

INSERT INTO my_table VALUES
('Bag','Blue'),
('Shoes','Blue'),
('Shirt','Yellow'),
('Sandal','Yellow'),
('Phone','Yellow'),
('Cotton','Blue'),
('Paper','Blue'),
('Biro','Blue'),
('Track','Yellow'),
('Pouch','Yellow'),
('Cap','Yellow'),
('Hat','Yellow'),
('Pants','Blue'),
('Bucket','Blue'),
('Belt','Blue'),
('Car','Yellow'),
('Socks','Yellow');

SELECT * FROM my_table ORDER BY CASE WHEN colors = 'blue' THEN RAND()*3 ELSE RAND()*7 END DESC LIMIT 10;
+----------+--------+
| Products | Colors |
+----------+--------+
| Socks    | Yellow |
| Shirt    | Yellow |
| Hat      | Yellow |
| Track    | Yellow |
| Cap      | Yellow |
| Sandal   | Yellow |
| Car      | Yellow |
| Pants    | Blue   |
| Shoes    | Blue   |
| Belt     | Blue   |
+----------+--------+

SELECT * FROM my_table ORDER BY CASE WHEN colors = 'blue' THEN RAND()*3 ELSE RAND()*7 END DESC LIMIT 10;
+----------+--------+
| Products | Colors |
+----------+--------+
| Track    | Yellow |
| Phone    | Yellow |
| Hat      | Yellow |
| Socks    | Yellow |
| Cap      | Yellow |
| Sandal   | Yellow |
| Shoes    | Blue   |
| Biro     | Blue   |
| Pouch    | Yellow |
| Bucket   | Blue   |
+----------+--------+

SELECT * FROM my_table ORDER BY CASE WHEN colors = 'blue' THEN RAND()*3 ELSE RAND()*7 END DESC LIMIT 10;
+----------+--------+
| Products | Colors |
+----------+--------+
| Sandal   | Yellow |
| Hat      | Yellow |
| Pouch    | Yellow |
| Socks    | Yellow |
| Cap      | Yellow |
| Bucket   | Blue   |
| Paper    | Blue   |
| Phone    | Yellow |
| Track    | Yellow |
| Shirt    | Yellow |
+----------+--------+

【讨论】:

  • 太棒了!!真的很好,正是我想要的@Strawberry。但我注意到有时它只带出 1 个蓝色行。和 9 个黄色行。有什么波动的原因吗?
  • 是的。按照我的介绍。这是一个加权概率。使用此方法返回所有 8 个蓝色条目是可能的(尽管不太可能)。
  • @kelrob 。 . .对于获得近似 30%/70% 的分割,这确实是一个有趣且聪明的解决方案。鉴于它似乎不符合您的实际要求,您接受了它是令人惊讶的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2021-07-28
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2020-12-13
相关资源
最近更新 更多