2010-09-24 109 views
1

我有一個數據庫,爲企業的項目清單:MySQL的選擇隨機

listings 
    `id` `location` `item` `status` 

所以在數據庫中,我可能有類似:

19 Loc A Green Beans for $12  active 
20 Loc B Two Gatoraids for $3 deactive 
21 Loc A Ham for $2 per lb  active 
22 Loc A Pepsi 2 for $2  active 
23 Loc C House plants $10 active 
24 Loc B Milk Gallon for $1  active 
25 Loc C Ice cream for $5 active 

沒有什麼,我想要做的是列出項目,但每個位置只有一個項目,並且如果某個位置有多個項目,我希望它的項目是隨機的。 Plus只顯示狀態=激活的項目。

現在是我的桌子設置能夠有效地做到這一點,或者我應該去另一條路線?

回答

1

沒有測試,但也許這樣的事情會工作:

SELECT 
    * 
FROM 
    `listings` 
WHERE 
    `status` = 'active' 
GROUP BY 
    `location` 
ORDER BY 
    RANDOM() 
+0

不是我打算如何。我只想顯示每個位置的一個項目,並且該項目是隨機的。因此,對於祿A來說,它可能是綠豆價格爲12美元,火腿爲每磅2美元,或者百事可樂2爲2美元。 – floatleft 2010-09-24 15:20:18

+0

也許不是從'listing'表中選擇,你可以從一個子查詢中進行選擇,該子查詢首先通過RANDOM()來排序。 – Pickle 2010-09-27 15:21:32

1

MySQL manual states

you can retrieve rows in random order like this: 
mysql> SELECT * FROM tbl_name ORDER BY RAND(); 

再加上一個WHERE子句僅要包括記錄過濾它,你有解決方案。

此外,如果您只有一個答案,請在您的查詢中使用LIMIT 1,並且它會選擇第一個結果,因爲排序順序是隨機的。

1

編輯: 這個答案進行了全面修改 - 我設法正確測試它MySQL和實現測試上的MS Access的SQL(不是一個好主意,反正)是給我完全不同的結果。

我認爲你需要使用這樣的事情:

SELECT l.id, s.location, s.item 
FROM listing AS l, 
      (SELECT location, item, status 
      FROM listing 
      WHERE status='active' 
      ORDER BY RAND()) AS s 
WHERE l.location=s.location 
AND l.status = 'active' 
GROUP BY location; 
+0

任何人都可以對此發表評論嗎?我似乎無法讓它在MySQL中運行 – floatleft 2010-09-24 17:40:29

+0

Wikeno提供了比我更簡潔的答案,我認爲這暴露了我的一些想法!當然,他是正確的,主查詢中的表引用都不是有用的。儘管如此,我仍然希望看到引用明確的列名。 – 2010-09-24 20:52:43

1

我覺得我得到了正確的邏輯與此查詢:

SELECT * 
FROM (
    SELECT * 
    FROM smt 
    WHERE status='active' 
    ORDER BY RAND() 
) AS random 
GROUP BY random.location; 

要小心!對於大型桌子來說這是無效的。