如果我有一张包含假设列foo
和bar
的表格。 bar可能有50-60个不同的值。我的目标是选择说,最多5行,比如说6个独特的条形。因此,如果从50-60中选出的6个唯一条形恰好至少有5行数据,那么我们总共有30行。
答案 0 :(得分:2)
你真正想做的是:
SELECT *
FROM `sometable`
WHERE `bar` IN (
SELECT DISTINCT `bar`
FROM `sometable`
ORDER BY RAND()
LIMIT 6
)
不幸的是,你可能会得到这个:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
可能你的版本会更合作。否则,您可能需要将其作为两个查询来执行。
答案 1 :(得分:1)
自从我使用MySQL以来已经有一段时间了(我最近一直在使用MSSQL),但有两件事情浮现在脑海中:
自我加入可能看起来像
SELECT DISTINCT bar FROM table AS t1 LIMIT 5
JOIN table AS t2 ON t1.foo = t2.foo
再次,它已经有一段时间了,所以这可能不是有效的MySQL。此外,你会得到所有 foo的5个条形,所以你必须弄清楚如何减少它。
答案 2 :(得分:0)
我认为最简单的方法是使用UNION。
SELECT * FROM table WHERE bar = 'a' LIMIT 5 UNION SELECT * FROM table WHERE bar='b' UNION SEL ....... you get the jist, i hope
编辑:不确定这是否是你需要的 - 你没有说这个查询是否还需要以某种方式确定条形图?或者如果他们被传入?
答案 3 :(得分:0)
一个简单的解决方案,需要7个查询:
SELECT distinct bar FROM sometable ORDER BY rand() LIMIT 6
然后,对于上面6个条形图中的每一个,执行此操作,用{$ bar}替换值,当然:
SELECT foo,bar FROM sometable WHERE bar='{$bar}' ORDER BY rand() LIMIT 5
小心使用“ORDER BY rand()”因为它可能导致MySQL从表中获取大量行,并计算所有这些行的rand()函数,然后对它们进行排序。如果你有一张大桌子,这可能需要很长时间。
如果确实需要很长时间,那么对于第一个查询,您可以删除ORDER BY和LIMIT子句,并在查询完成后在程序代码中选择6个随机值。
对于第二个查询,您可以将其拆分为两个步骤:
SELECT count(*) FROM sometable WHERE bar='{$bar}'
然后,在您的程序代码中,您知道有多少项目,因此您可以随机选择要查看的项目,并使用OFFSET和LIMIT:
SELECT foo,bar FROM sometable WHERE bar='{$bar}' LIMIT 1 OFFSET {$offset}
答案 4 :(得分:-1)
这是从某个程序调用的吗?
如果是这样,也许您可以只查找条形图,然后将它们随机发送到select语句中。
这样你的选择可能就是:select * from table in where in(?,?),你可以将随机性问题转移到代码中,这在处理这个问题时更为明智。