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


Select 4 random items from 3 random categories MySQL (and more)

我有关于测试页面幻灯片放映的具体请求:http://bybyweb.com/mealbook/

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

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

数据库方案:类别:id,title,parent_idcategory_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个食谱。。。我想还有更多可能的解决方案,我可能需要嵌套选择,或者其他什么。。。。

我想你需要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标准的联接语法。通过使用别名,您的查询也将更具可读性。

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