SQL语句问题。假设我的迷你桌里有以下东西。假设这个表是"图像"
ID | file_name |fruit_type |
================================
1 | ex.jpg | apple |
2 | am.png | apple |
3 | pl.jpeg | orange |
4 | e.png | orange |
5 | yep.png | apple |
好的。所以当我调用这个时,我希望它提取两张图片,每张图片都应该是从一个fruit_type中随机选择的。所以苹果只能和苹果一起摘。桔子只能和桔子一起采摘。这两种类型不应同时存在。
它就是在这里坏掉的。假设我运行的代码是这样的:
$query="SELECT * FROM images WHERE fruit_type='apple'
OR fruit_type='orange' ORDER BY RAND() LIMIT 0,2";
这将返回两个随机选择,就像我想要的那样。然而,这同时捕获了该列中的苹果和橙色类型。
我一直在尝试确定一个SQL语句,它可以选择苹果或桔子,但决不能同时选择两者。我还不够,所以我求助于你们所有人。
您可以创建两个查询,第一个用于apple,第二个用于orange,并选择随机apple和随机orange,然后使用UNION ALL
子句将它们连接起来。
以下内容将起作用,但从性能的角度来看,如果您的表变得巨大(数百万条记录),那么这将不是一个很好的选择。以下查询获取具有相同fruit_type的所有图像组合,不包括匹配的图像(您不希望同一图像出现两次,是吗?)。
SELECT images1.*, images2.*
FROM images images1, images images2
WHERE images1.id != images2.id
AND images1.fruit_type = images2.fruit_type
ORDER BY RAND()
LIMIT 0,2
由于MySQL中没有窗口函数,您必须即兴发挥。本文改编自Quassnoi:的博客文章
SELECT
distinct
@fi AS file_name,
fruit_type
FROM (
SELECT m.*
FROM (
SELECT @_f = NULL
) vars,
images m
ORDER BY
fruit_type, rand()
) mo
WHERE (CASE WHEN @_f IS NULL OR @_f <> fruit_type THEN @fi := file_name ELSE file_name END IS NOT NULL)
AND (@_f := fruit_type) IS NOT NULL