MySQL查询问题

时间:2009-03-12 21:23:01

标签: sql mysql database

如果我有一张包含假设列foobar的表格。 bar可能有50-60个不同的值。我的目标是选择说,最多5行,比如说6个独特的条形。因此,如果从50-60中选出的6个唯一条形恰好至少有5行数据,那么我们总共有30行。

5 个答案:

答案 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(?,?),你可以将随机性问题转移到代码中,这在处理这个问题时更为明智。