为什么 `ORDER BY RAND()` 语句在我的查询中不起作用?
Why is the `ORDER BY RAND()` statement not working in my query?
我有一个数据库,用于保存有关我的产品的信息。我使用查询从我的 table 获取这些产品。查询如下所示:
SELECT * FROM products WHERE stock > 0 ORDER BY RAND();
此查询 returns 所有具有 stock > 0
的产品随机排序,它工作正常。但是,现在我想获得带有 stock = 0
的那些产品,但我希望它们出现在查询的末尾(也是以随机方式但总是在具有 stock > 0
的产品之后)。所以我尝试了一个看起来像这样的新查询:
(SELECT * FROM products WHERE stock > 0 ORDER BY RAND())
UNION
(SELECT * FROM products WHERE stock = 0 ORDER BY RAND());
...此查询最后 returns 零库存产品,但它似乎忽略了 ORDER BY RAND()
语句,我总是以相同的顺序获取它们。所以我的问题是:如何从最后保持零库存产品条件的查询中获得随机响应?
使用 case 语句创建要排序的字段
例如
CREATE TABLE IF NOT EXISTS `products` (
`id` int(6) unsigned NOT NULL,
`stock` int(3) unsigned NOT NULL,
`product` varchar(200) NOT NULL,
PRIMARY KEY (`id`,`product`)
) DEFAULT CHARSET=utf8;
INSERT INTO `products` (`id`, `stock`, `product`) VALUES
('1', '10', 'Timber'),
('2', '12', 'Nails'),
('1', '0', 'Glue'),
('1', '0', 'Left handed wrench.');
和运行
SELECT stock, product, case when stock > 0 then 1 else 2 end as SetOrder
FROM products
ORDER BY SetOrder, RAND()
得到你
stock product SetOrder
10 Timber 1
12 Nails 1
0 Glue 2
0 Left handed wrench. 2
你不需要UNION
:
SELECT *
FROM products
ORDER BY stock = 0, RAND();
ORDER BY
子句中的条件 stock = 0
确保将 zero-stock 产品放在最后,使用 RAND()
的第 2 级排序会随机化每个产品中的行2 个组中的一个。
我有一个数据库,用于保存有关我的产品的信息。我使用查询从我的 table 获取这些产品。查询如下所示:
SELECT * FROM products WHERE stock > 0 ORDER BY RAND();
此查询 returns 所有具有 stock > 0
的产品随机排序,它工作正常。但是,现在我想获得带有 stock = 0
的那些产品,但我希望它们出现在查询的末尾(也是以随机方式但总是在具有 stock > 0
的产品之后)。所以我尝试了一个看起来像这样的新查询:
(SELECT * FROM products WHERE stock > 0 ORDER BY RAND())
UNION
(SELECT * FROM products WHERE stock = 0 ORDER BY RAND());
...此查询最后 returns 零库存产品,但它似乎忽略了 ORDER BY RAND()
语句,我总是以相同的顺序获取它们。所以我的问题是:如何从最后保持零库存产品条件的查询中获得随机响应?
使用 case 语句创建要排序的字段
例如
CREATE TABLE IF NOT EXISTS `products` (
`id` int(6) unsigned NOT NULL,
`stock` int(3) unsigned NOT NULL,
`product` varchar(200) NOT NULL,
PRIMARY KEY (`id`,`product`)
) DEFAULT CHARSET=utf8;
INSERT INTO `products` (`id`, `stock`, `product`) VALUES
('1', '10', 'Timber'),
('2', '12', 'Nails'),
('1', '0', 'Glue'),
('1', '0', 'Left handed wrench.');
和运行
SELECT stock, product, case when stock > 0 then 1 else 2 end as SetOrder
FROM products
ORDER BY SetOrder, RAND()
得到你
stock product SetOrder
10 Timber 1
12 Nails 1
0 Glue 2
0 Left handed wrench. 2
你不需要UNION
:
SELECT *
FROM products
ORDER BY stock = 0, RAND();
ORDER BY
子句中的条件 stock = 0
确保将 zero-stock 产品放在最后,使用 RAND()
的第 2 级排序会随机化每个产品中的行2 个组中的一个。