MySql - Получить Min, Max и 3 random Rows
Я хочу, чтобы запрос MySql получил 5 строк, которые включают минимальную цену, максимальную цену и другие 3 случайные строки.
Таблица:
ID Product Price
1 data 2
2 data 20
3 data 55
4 data 24
5 data 2
6 data 15
7 data 10
8 data 33
9 data 3
10 data 30
Ожидаемый результат (с 3 случайными строками)
ID Product Price
1 data 2
3 data 55
4 data 24
6 data 15
7 data 10
Любая помощь будет принята с благодарностью!
Ответы
Ответ 1
SELECT table.*
FROM table
, ( SELECT @minPrice := ( SELECT min(Price) FROM table ) minPrice
, @minId := ( SELECT id FROM table WHERE Price = @minPrice ORDER BY rand() LIMIT 1 )
, @maxPrice := ( SELECT max(Price) FROM table ) maxPrice
, @maxId := ( SELECT id FROM table WHERE Price = @maxPrice ORDER BY rand() LIMIT 1 )
) tmp
WHERE table.id in (@minId,@maxId)
UNION
(SELECT *
FROM table
WHERE Price not in (@minPrice,@maxPrice)
ORDER BY rand()
LIMIT 3
)
Ответ 2
Вы можете сделать это,
select * from table order by Price asc limit 0,1
union all
select * from table order by Price desc limit 0,1
union all
select * from table order by RAND() limit 0,3
Ответ 3
вы можете получить его с помощью UNION и подзапроса:
(SELECT * FROM table ORDER BY Price ASC LIMIT 0 , 1 )
UNION ALL
(SELECT * FROM table ORDER BY Price DESC limit 0,1 )
UNION ALL
(SELECT * FROM table WHERE Price NOT IN ( SELECT CONCAT( MIN( `Price` ) , ',', MAX( `Price` ) ) AS MaxPrice FROM table ) ) ORDER BY RAND( ) LIMIT 0 , 3 )
Ответ 4
Итак... получите min, получите max, получите все остальные записи, которые не являются min и max, сортируют по rand и возвращают первые 3, которые не являются min и max.
Вот скрипта SQL
-- get the first occurence of any item matching the products and prices returned
select min(top_bottom_and_3_random.id) id, top_bottom_and_3_random.product, top_bottom_and_3_random.price from (
-- get the min and the max
select distinct product, price from top_bottom_and_3_random where price in (
select max( price) from top_bottom_and_3_random
union select min( price ) from top_bottom_and_3_random
) union
select product, price from (
-- get 3 random rows that are not max or min
select rand() rand, product, price from (
select product, price from top_bottom_and_3_random where price not in (
select max( price) from top_bottom_and_3_random
union select min( price ) from top_bottom_and_3_random
) group by product, price
) rand_product_price_group
order by rand
limit 3
) random_mix
) min_max_3_random
inner join top_bottom_and_3_random
on min_max_3_random.product = top_bottom_and_3_random.product
and min_max_3_random.price = top_bottom_and_3_random.price
group by top_bottom_and_3_random.product, top_bottom_and_3_random.price
order by id
-- example results
id product price
1 data 2
3 data 55
4 data 24
7 data 10
10 data 30
Ответ 5
SELECT x.*
FROM my_table x
JOIN (SELECT MIN(price) a, MAX(price) b FROM my_table) y
ORDER
BY COALESCE(x.price NOT IN (a,b))
, RAND()
LIMIT 5;
Для решения проблемы Кейта... так что, если мы всегда должны иметь 3 и 1 или 5...
SELECT x.id
, x.product
, x.price
FROM my_table x
JOIN (
(SELECT id FROM my_table ORDER BY price, RAND() LIMIT 1)
UNION
(SELECT id FROM my_table ORDER BY price DESC, RAND() LIMIT 1)
) y
GROUP
BY x.id
, x.product
, x.price
ORDER
BY MIN(COALESCE(x.id != y.id))
, RAND()
LIMIT 5;
... но это начинает немного глотать - может быть разумнее решить это в коде приложения.
Ответ 6
Вы можете воспользоваться вспомогательным запросом MySQL, чтобы получить желаемый результат
select * from table WHERE Price = (SELECT MIN(Price ) FROM table)
union all
select * from table WHERE Price = (SELECT MAX(Price ) FROM table)
union all
select * from table order by RAND() limit 0,3
Ответ 7
(select * from table order by Price limit 1)
union
(select * from table order by Price desc limit 4)