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 

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

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

Related of "MySQL Выбор по случайным"

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

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

В руководстве MySQL указано :

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

Объедините это с предложением WHERE, чтобы отфильтровать его только записями, которые вы хотите включить, и у вас есть решение.

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

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

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

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

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;