嗨我到目前为止尝试了多种方法,我有一张laaaaarge表(数千条记录),我有各种各样的旅行,除了其他几个不同国家的价值,以及几天的旅行时间,我想 randonly选择给定数量的随机项目,其中包含来自给定旅行的随机选择,其中包含每个国家/地区最短的部分,但在某些国家/地区,最短行程为8天,其他地方为12,...等等。
| country | duration | price | departure | hotelname | otherData |
| A | 8 | 123 | 2013-06-19 | hotel A | blah blah |
| A | 15 | 234 | 2013-06-20 | hotel A | blah blah |
| A | 15 | 234 | 2013-06-20 | hotel B | blah blah |
| A | 15 | 234 | 2013-06-20 | hotel C | blah blah |
| B | 8 | 345 | 2013-06-21 | hotel D | blah blah |
| C | 12 | 456 | 2013-06-22 | hotel E | blah blah |
...
我需要构建一个随机数组,其中包含6条记录,其中包含选择的行程,尝试最小化显示来自同一国家/地区的更多结果(但如果没有足够的不同国家/地区在表中,则允许)随机选择某个国家/地区的最长持续时间的记录 ..
问题是一些国家有8天的最短旅行,其他地方是11天,所以我不能做一个简单的
where days<9
也是因为在季节结束时可能会有很少的旅行导致结果不够,我不能做一个
group by country
我的想法是为每个国家/地区选择6条记录,使用按持续时间ASC 的顺序为该国家/地区提供最短的持续时间,然后让所有国家/地区的结果按rand()重新排序并首先选择6 ...
答案 0 :(得分:0)
可能的方法,但可能效率不高。
SELECT country, duration, price, departure, hotelname, otherData
FROM
(
SELECT a.country, a.duration, a.price, a.departure, a.hotelname, a.otherData,
@counter := IF(a.country = @PrevCountry, @counter + 1, 0) AS CountryCounter,
@PrevCountry := a.country
FROM (SELECT * FROM SomeTable ORDER BY country, duration, RAND()) a
CROSS JOIN (SELECT @counter:=0, @PrevCountry:='') Sub2
) Sub1
WHERE CountryCounter < 6
这是使用用户变量来获取某个国家/地区的每条记录的序列号,然后使用该序列号处理每个国家/地区的第1个记录之后的任何记录。
未经测试。