У меня есть список предметов для предприятий в базе данных:
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
Нет, что я хочу сделать, это перечислить элементы, НО только один элемент для каждого местоположения, и если для местоположения имеется более одного элемента, я хочу, чтобы этот элемент был случайным. Плюс только отображаемый элемент, который имеет статус = активный.
Теперь моя таблица настроена так, чтобы быть в состоянии сделать это эффективно или мне нужно идти другим путем?
Не тестировалось, но, возможно, что-то вроде этого будет работать:
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;