我有一个项目在数据库业务的列表:
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;
小心! 这是大表非常无效。
编辑:这个答案是完全修订-我设法正确测试它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;