2

我有与测试页面上的幻灯片相关的具体要求:http: //bybyweb.com/mealbook/

所有大图片都应该是来自随机类别的图像,并在文本中列出了该类别中的三个食谱。小缩略图应显示任何类别的随机食谱。

因此,应该有 3 个随机类别,这些类别中的 12 个菜谱(按 4 分组),以及 9 个随机菜谱,与其余菜谱无关......

数据库方案: 类别:id、标题、parent_id category_to_recipe:id、rec_id、cat_id(此表存在是因为 recipe 可以属于多个类别) recipes:id、name 等,等等...

这个查询:

SELECT category_recipe.rec_id, category_recipe.cat_id, recipes.name, recipes.url, recipes.main_image, categories.id, categories.title
FROM recipes, category_recipe, categories
WHERE categories.id
IN ( 10, 30, 64 )
AND category_recipe.cat_id = categories.id
AND category_recipe.rec_id = recipes.id
ORDER BY RAND( )
LIMIT 12

从 3 个类别返回 12 个随机食谱,但我每个类别需要 4 个食谱……我想还有更多可能的解决方案,我可能需要嵌套选择或其他东西……

4

2 回答 2

0

我会将该查询拆分为 3 个类别中的每一个,我看不出有什么让它如此复杂的原因,因为这些选择非常简单,如果速度是你的问题,它会非常快。

于 2013-02-06T01:57:32.337 回答
0

我认为你需要union all这个:

SELECT cr.rec_id, cr.cat_id, r.name, r.url, r.main_image, c.id, c.title

from ((select cr.* from category_recipe where cat_id = 10 order by rand() limit 4
      ) union all
      (select cr.* from category_recipe where cat_id = 30 order by rand() limit 4
      ) union all
      (select cr.* from category_recipe where cat_id = 64 order by rand() limit 4
     ) cr join
     categories c
     on cr.cat_id = c.id join
     recipes r
     on cr.rec_id = r.id

此外,您应该使用 ANSI 标准连接语法。通过使用别名,您的查询也将更具可读性。

于 2013-02-06T02:00:50.303 回答