2013-07-23 3 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 

Это возвращает правильный номер, с которого был выбран данных, но данные возвращаемые не случайным - это всегда та же строка. Поэтому мне нужно получить количество строк, которые были выбраны rand() после того, как WHERE был применен. Таким образом, сделав запрос по таблице выше должен возвращать:

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 Смотрите это, чтобы увидеть его работу без где заявления.

+0

Убедитесь, что столбец данных имеет индекс или покрывал существующий индекс. – kheld

1

Я думаю, что проще всего присоединиться к другому оператору выбора, чтобы получить общее количество строк и добавить, что к вашему основному ЗЕЬЕСТУ.

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

Смежные вопросы