2013-11-26 56 views
3

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 | 

好的。所以當我打電話給我時,我想讓它拉兩張照片,每張照片都應該是水果類型中的隨機選擇。所以蘋果只能用蘋果挑選。桔子只能用橙子挑選。不應該有兩種類型的組合。

這裏是它分解的地方。假設我運行的代碼是這樣的:

$query="SELECT * FROM images WHERE fruit_type='apple' 
OR fruit_type='orange' ORDER BY RAND() LIMIT 0,2"; 

這將返回兩個隨機選擇,就像我想要的。但是,這從該專欄中捕獲了蘋果和橙色兩種類型。

我一直在試圖確定一個SQL語句,它可以讓它選擇蘋果或桔子,但從來都沒有。我已經寫得很短,所以我正在轉向所有人。

+0

*「所以蘋果應該只挑......」 * - 大雙關語BTW ;-)我幾乎想+1你只是爲。 –

+2

學習代碼...必須保持它的光:) – darkginger

回答

0

您可以先創建兩個查詢,第一個用於蘋果,第二個用於桔子,然後選擇隨機蘋果和隨機橙色,然後使用UNION ALL子句將其加入。

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 
+0

而不是做'images1。*',我會建議只選擇你需要的字段和應用別名。也許'images1.file_name AS fileName1,images1.fruit_type AS fruitType1,images2.file_name AS fileName2,images2.fruit_type AS fruitType2'。這會讓你的東西更具可讀性。 –

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