0

到目前为止,我尝试了多种方法,我有一个大表(数千条记录),其中我有各种旅行,除了其他值之外,还有一些不同的国家,以及旅行的持续时间(以天为单位),我想随机选择给定数量的随机项目包含从给定行程中的随机选择,包含每个国家/地区的最短行程,但在某些国家/地区最短行程为 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 条记录,使用 为该国家/地区提供最短的持续时间order by duration ASC,然后让所有国家/地区的结果重新排序rand()并选择前 6 条。

4

1 回答 1

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

这是使用用户变量来获取一个国家/地区的每条记录的序列号,然后使用该序列号来处理每个国家/地区的第一个 6 之后的任何记录。

未测试。

于 2013-06-17T12:31:45.583 回答