如何实现SQL语句来创建/或功能

时间:2013-11-26 04:07:04

标签: php sql

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语句,但从不同时选择苹果或橙子。我很短暂,所以我转向你们所有人。

3 个答案:

答案 0 :(得分:0)

您可以创建两个查询,首先是苹果,第二个是橙子,然后选择随机苹果和随机橙色,然后使用UNION ALL子句加入它们。

答案 1 :(得分:0)

以下内容可行,但从性能的角度来看,如果您的表变得庞大(数百万条记录),它将不是一个很好的选择。以下查询采用具有相同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

答案 2 :(得分:0)

由于您在MySQL中没有窗口函数,因此您必须即兴创作。这篇文章改编自this blog post by 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