计算不同的元素并仅返回一个元素

时间:2013-07-23 17:04:23

标签: mysql sql

我在一个名为'data'

的列中有一个包含许多整数的表
data  |  param

123      1
432      1
123      1
423      2
234      1
423      2

我有一个查询

SELECT data FROM data_table WHERE param=*something* GROUP BY data
    ORDER BY rand() LIMIT 1

从表中返回一个随机的不同整数。但我还需要得到我选择的整数总数。我试过了:

SELECT DISTINCT(data) AS data, COUNT(DISTINCT(data)) as count FROM
    data_table WHERE param=*something* ORDER BY rand() LIMIT 1

这将返回选择数据的正确数字,但返回的数据不是随机的 - 它始终是同一行。所以我需要获得在应用WHERE后选择rand()的行数。因此,对上表进行查询应返回:

query WHERE param='1':
    data  count
    123   3
query WHERE param='1':
    data  count
    432   3
query WHERE param='1':
    data  count
    234   3
query WHERE param='2':
    data  count
    423   1

4 个答案:

答案 0 :(得分:2)

这很有效。我通常不建议在选择器中放置查询,因为它会评估返回的每一行。但是在这种情况下,您只返回一行,因此没问题。

select 
count(distinct data) as cnt,
(SELECT data FROM data_table GROUP BY data
    WHERE param='xxx'
    ORDER BY rand() LIMIT 1) as random
from data_table
WHERE param='xxx'

请参阅此SQL Fiddle,看看它没有where语句。

答案 1 :(得分:1)

我认为最简单的方法是加入另一个select语句来获取总行数并将其添加到主SELECT语句中。

SELECT data AS data, count.count
FROM data 
JOIN (SELECT COUNT(DISTINCT(data)) AS count FROM data WHERE parameter = "test") AS count
WHERE parameter = "test"
ORDER BY rand()
LIMIT 1;

Here's a SQL Fiddle

答案 2 :(得分:1)

我认为这种情况需要分两步进行:

  1. 选择param具有您想要的值的随机条目
  2. 计算数据条目
  3. 我提出这个解决方案

    set @yourParam = 1; -- Put here the parameter value you want to filter
    select 
        data, 
        (select count(distinct date) from data_table where param=@yourParam) as `count`
    from 
        data_table
    where 
        param = @yourParam
    order by 
        rand()
    limit 1;
    

    希望这有助于你

答案 3 :(得分:1)

试试这个

select 
     data, (select count(distinct data) from data_table where param=1) as `count`
from 
   data_table  where param = 1
order by rand()
limit 1

DEMO HERE