如何实现SQL语句来创建非此即彼的功能


How to implement SQL statement to create either/or functionality

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