2013-07-23 34 views
0

我有在列許多整數表名爲「數據」計數獨特的因素,只返回一個

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 
+0

給出例子的結果你想要 –

+0

@echo_Me更新 – Xeos

回答

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語句的工作。

+0

確保數據列有索引或覆蓋的現有索引。 – kheld

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

1

我認爲這種情況需要在兩個步驟進行分割:

  1. 選擇隨機條目,其中param的值爲您想
  2. 計數的數據項

我建議此解決方案

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

希望這可以幫助你

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