从3个随机类别中选择4个随机项MySQL(及更多)

时间:2013-02-06 01:14:27

标签: php mysql

我在测试页面上有关于幻灯片显示的具体请求: http://bybyweb.com/mealbook/

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

所以,应该有3个随机类别,12个来自这些类别的食谱(按4分组),以及9个随机食谱,与其他类别无关......

数据库方案: category:id,title,parent_id category_to_recipe:id,rec_id,cat_id(这个表是因为配方可以在多个类别中) 食谱:id,名称等等......

此查询:

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个食谱...... 我想有更多可能的解决方案,我可能需要嵌套选择,或者其他......

2 个答案:

答案 0 :(得分:0)

我会将这三个类别中的每个类别的查询分开,我没有看到使其变得如此复杂的原因,当这些选择非常简单时,如果速度是你的问题,它将会非常快速。

答案 1 :(得分: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标准连接语法。使用别名,您的查询也会更具可读性。