2017-01-05 2 views
1

Ненавижу, что я должен спросить, но я просто не могу справиться с этим.Как подсчитать значения с разными предложениями в том же столбце?

У меня есть эта таблица votes:

enter image description here

type=1 является upvote, type=0 бы downvote

Я хочу, чтобы этот вывод:

[ 
    {'video': 'best-of-mehrwert', 'upvote': 2, 'downvote': 0}, 
    {...} 
] 

Я использую Medoo:

<?php 
$votes = $database->query(
    // 'SELECT COUNT(video) as votes, video FROM votes GROUP BY video, type' 
    ' 
    SELECT video,COUNT(*) as counts 
    FROM votes 
    GROUP BY video,type; 

    ' 
)->fetchAll(PDO::FETCH_ASSOC); 

echo json_encode($votes); 

, который дает мне

[{"video":"anlaesse","counts":"1"},{"video":"best-of-mehrwert","counts":"2"}] 

Как «добавить столбец» как «upvotes» то есть записи, где тип = 1 и то же самое с типом = 0?

ответ

1

Я думаю, что это может быть проще SUM вверх-для каждой строки, где ваши критерии соответствуют:

SELECT 
    video, 
    SUM(CASE type WHEN 1 THEN 1 ELSE 0 END) as upvotes, 
    SUM(CASE type WHEN 0 THEN 1 ELSE 0 END) as downvotes 
FROM 
    votes 
GROUP BY 
    video; 

Обратите внимание, вы должны опустить type из GROUP BY, чтобы получить одну строку назад для каждого видео ,

+0

Это здорово! он работает, спасибо большое. любые заметки о производительности? есть ли, возможно, встроенная функция для этого? – Alex

+1

Производительность не должна быть проблемой, но было бы трудно сказать, не зная определения вашего стола и того, какие индексы у вас уже есть, и размера этой таблицы с течением времени. Я не могу поговорить с ним. –

0

Вы можете использовать case выражение для подсчета только тип голосов вы заинтересованы в:

SELECT video, 
     COUNT(CASE type WHEN 1 THEN 1 END) as upvotes 
     COUNT(CASE type WHEN 0 THEN 1 END) as downvotes 
FROM  votes 
GROUP BY video, type; 
2

двух вариантах:

select 
    video, 
    sum(case when type=1 then 1 else 0 end) as upvote, 
    sum(case when type=0 then 1 else 0 end) as downvote 
from votes 
group by video 

и

select 
    video, 
    sum(type) as upvote, 
    sum(1-type) as downvote 
from votes 
group by video 

http://www.sqlfiddle.com/#!9/c73f2a/5

+0

второй, похоже, не работает, я не получаю ошибку, просто 'вызов функции-члена fetchAll() на boolean' – Alex

+0

@Alex он работает в sql-скрипте –

+0

, вероятно, не может обрабатывать его:/ – Alex

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