2010-09-24 3 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 

Нет, что я хочу сделать, это перечислите элементы, НО только один элемент для каждого местоположения, и если есть более одного элемента для местоположения, я хочу, чтобы этот элемент был случайным. Плюс только отображаемый элемент, который имеет статус = активный.

Теперь мой стол настроен так, чтобы быть в состоянии сделать это эффективно или я должен пойти другим путем?

ответ

1

Не тестировался, но, возможно, что-то, как это будет работать:

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

Не так, как я намерен. Я хочу отобразить только одно местоположение PER, и этот элемент будет случайным. Таким образом, для Loc A это могут быть другие зеленые бобы за 12 долларов, Ham за 2 доллара за фунт, или за Pepsi 2 за 2 доллара. – floatleft

+0

Возможно, вместо выбора из таблицы «listings» вы можете выбрать из подзапроса, который сначала заказывает все по RANDOM(). – Pickle

1

MySQL manual states:

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

Объединить, что с ИНЕКЕ отфильтровать его только записи, которые вы хотите включить, и у вас есть решение.

Кроме того, если у вас есть только один ответ, используйте LIMIT 1 по вашему запросу, и он выберет первый результат, который (из-за порядка сортировки) будет случайным.

1

EDIT: Этот ответ полностью переработан - мне удалось протестировать его должным образом на MySQL и понял, тестирование SQL на MS Access (не яркая идея в любом случае) дает мне совершенно разные результаты.

Я думаю, вам нужно использовать что-то вроде этого:

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

+0

Wikeno произвел более сжатый ответ, чем у меня, и я думаю, что он демонстрирует какое-то мутное мышление с моей стороны! Он, конечно, исправит, что ни одна из ссылок на таблицы в основном запросе не полезна. Тем не менее я по-прежнему предпочитаю видеть имена столбцов. –

1

Я думаю, что я получил логику прямо с этим запросом:

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

Будьте осторожны! Это очень неэффективно для больших таблиц.

Смежные вопросы