2013-10-07 2 views
0

Я интересно, если есть простой способ, чтобы получить число, сколько строк различных значений у меня есть (плохое объяснение, я знаю)сосчитать, сколько каждое отдельное значение в SQL таблице

Примера: У меня есть таблица , который регистрирует представления для моих статей в блогах. Я хочу посчитать, сколько просмотрели статью a и сколько b (у меня есть много статей, я хочу получить 10 самых популярных статей)

Итак, есть простой способ получить это с помощью SQL, на данный момент Я сделал это с помощью php-массивов, я получаю все отдельные строки в массиве, затем я получаю, сколько строк есть для каждого значения массива, затем я сортирую массив и эхо в первую очередь 10, но это слишком много запросов, я было интересно, если есть способ сделать это с 1 запросом?

+0

Как выглядит ваш стол? –

ответ

2
select 
    a.article_id, 
    a.title, 
    a.date, 

    /* Make sure to count a relevant view from the *views* table. 
    -- This makes sure that count returns 0 instead of 1 when 
    -- the article isn't viewed yet. */ 
    count(v.article_id) as viewcount 

from 
    Article a 

    /* Using left join here, to also include articles that are not viewed at all. 
    -- You can change this to an inner join if you don't want to include those. */ 
    left join ArticleView v on v.article_id = a.article_id 

group by 
    /* Group by article id, so count() actually counts per article. */ 
    a.article_id 

order by 
    /* Place the best viewed articles on top. */ 
    count(v.article_id) desc 

    /* And return only 10 articles at most. */ 
limit 10 

Этот запрос вернет 10 статей, даже если их 10 нет. Если вы хотите, чтобы вернуться только статьи, которые на самом деле имеют взгляды, и вам не нужны другие поля из таблицы статьи, вы можете упростить запрос немного:

select 
    v.article_id, 
    count(v.article_id) as viewcount 
from 
    ArticleView v 
group by 
    v.article_id 
order by 
    count(v.article_id) desc 
limit 10 

Но преимущество первого запроса является то, что вам также можете добавить в ваш запрос другие поля 'a', например название. Таким образом, этот единственный запрос может фактически вернуть всю информацию, необходимую для создания всего списка из списка «топ-10», а второй - только список идентификаторов.

+0

спасибо, использовал второй вариант, это именно то, что мне нужно :) – bazinga

1

Это легко сделать с помощью группировки sql.

select articleid, count(*) from view_table group by articled 

Очевидно, что вам необходимо будет изменить таблицы и поля.

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