0

我有一张鸡尾酒食谱和其他东西的桌子。我还有一张表,上面显示了喜欢的食谱。我想查看最后一天提到的食谱,如果结果小于 1000,则用不在 FEED 表上的随机食谱填写剩余的 1000。

例子

饲料:食谱 1 今天(1 分钟前)喜欢(鸡尾酒),食谱 2 昨天喜欢(不是鸡尾酒),食谱 3 今天喜欢(1 小时前)(鸡尾酒),食谱 4 今天喜欢(3 分钟前)(不是鸡尾酒) .

配方表:不言自明

类别表:

recipe 1, cocktail
recipe 2, juice
recipe 3, cocktail
recipe 4 juice
recipe 3333 cocktail
recipe 4444 cocktail
recipe nnnn cocktail

我的视图需要显示:

食谱 1、食谱 4、食谱 3(按最近的顺序点赞)。然后填充剩余的 1000,从配方表中随机获取:配方 4444、配方 3333、配方 nnnn。

最终结果:配方 1、配方 4、配方 3、配方 4444、配方 3333、配方 nnnn

下面的代码尝试执行此操作,但顺序错误(顶部没有按顺序排列的配方 1、4、3。它们混合在一起......

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `XXXX` 
    SQL XXXX
VIEW `cocktails` AS
    (select 
        `r`.`name` AS `name`,
        `r`.`myId` AS `myId`
    from
        ((`recipe` `r`
        join `feed` `f` ON ((`r`.`myId` = `f`.`recipe_id`)))
        join `category` `c` ON ((`r`.`myId` = `c`.`recipe_id`)))
    where
        (`c`.`name` like '%cocktails%')
    group by `r`.`name`
    order by (max(`f`.`timeStamp`) >= (now() - interval 1 day)) desc , (`r`.`myId` is not null) desc)

    union 

    (select 
        `r`.`name` AS `name`,
        `r`.`myId` AS `myId`
    from
        ((`recipe` `r`
        join `category` `c` ON (`r`.`myId` = `c`.`recipe_id`)))
    where
        (`c`.`name` like '%cocktails%')

    )
    limit 0,1000
4

1 回答 1

1

我认为您可以order by在 MySQL 的视图中使用。但是,我认为您可以通过组合查询来解决您的问题。left outer joinfeeds桌子做一个。然后,按提要的存在对结果进行排序:

CREATE VIEW cocktails AS
    select r.name, r.myId
    from recipe r join
         category c
         ON r.myId = c.recipe_id left outer join
         feed f
         ON r.myId = f.recipe_id
    where c.name like '%cocktails%'
    group by r.name
    order by (f.recipe_id is not null) desc,
             max(f.timestamp) >= (now() - interval 1 day) desc,
             r.myId is not null desc
    limit 0,1000;

我还去掉了反引号——它们使代码很难阅读。

于 2013-09-18T02:37:34.787 回答