2012-06-05 6 views
0

У меня есть следующий запрос.Запрос, возвращающий неверный счет

SELECT a.link_field1 AS journo, count(a.link_id) as articles, AVG(b.vote_value) AS score FROM dan_links a LEFT JOIN dan_votes b ON link_id = vote_link_id WHERE link_field1 <> '' and link_status NOT IN ('discard', 'spam', 'page') GROUP BY link_field1 ORDER BY link_field1, link_id 

Этот запрос возвращает счет 3 для первого элемента в списке. Что должно быть возвращены

Journo | count | score 
John S | 2 | 6.00 
Joe B | 1 | 4 

Однако для первого John S, он возвращает число 3.

Если я непосредственно запрос

select * from dan_links where link_field1 = 'John S' 

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

Как я могу получить правильное количество или мой запрос полностью не прав?

EDIT: Содержание таблиц

dan_links

link_id | link_field1 | link | source | link_status 
1 | John S | http://test.com | test.com | approved 
2 | John S | http://google.com | google | approved 
3 | Joe B | http://facebook.com | facebook | approved 

dan_votes

vote_id | link_id | vote_value 
1 | 1 | 5 
2 | 1 | 8 
3 | 2 | 4 
4 | 3 | 1 

EDIT: он выглядит, как он рассчитывает строки в таблице Проголосовали по какой-то причине

+0

Проводка записей (из 2 таблиц), с которыми вы работали, была бы полезна. – codingbiz

+0

cheers Я добавил, что выше – Dannymh

+0

Итак, я удалил одну из записей для link_id 1 в таблице голосов, а счетчик пришел в 2, что верно, но я не понимаю, почему это будет так, потому что мой счет находится на .link_id – Dannymh

ответ

0

Когда вы выполняете левое внешнее соединение с условием link_id = vote_link _id для каждой соответствующей записи один ряд создается, некоторые вещи, как

link_id | link_field1 | link | source | link_status|vote_id|vote_value 
1 | John S | http://test.com | test.com | approved|1|5 
1 | John S | http://test.com | test.com | approved|2|8 
2 | John S | http://google.com | google | approved|3|4 
3 | Joe B | http://facebook.com | facebook | approved|4|1 

Теперь, когда вы делаете группу, на link_field1, вы получите рассчитывать как 3 для John S

Вложенный запрос может работать

SELECT journo,count(linkid) as articles,AVG(score) FROM 
(SELECT a.link_field1 AS journo, AVG(b.vote_value) AS score, a.link_id as linkid 
FROM dan_links a 
LEFT JOIN dan_votes b 
ON link_id = vote_link_id 
WHERE link_field1 <> '' 
and link_status NOT IN ('discard', 'spam', 'page') 
GROUP BY link_id 
ORDER BY link_field1, link_id) GROUP BY journo 

приведенный выше запрос будет давать неправильный среднем, как ((n1 + n2)/2 + n3)/2! = (n1 + n2 + n3)/3, поэтому используйте расположенную ниже запросе

SELECT journo,count(linkid) as articles, SUM(vote_sum)/SUM(count(linkid)) 
FROM 
    (SELECT a.link_field1 AS journo, SUM(b.vote_value) AS vote_sum, a.link_id as linkid, count(a.link_id) as count_on_id 
    FROM dan_links a 
    LEFT JOIN dan_votes b 
    ON link_id = vote_link_id 
    WHERE link_field1 <> '' 
    and link_status NOT IN ('discard', 'spam', 'page') 
    GROUP BY link_id 
ORDER BY link_field1, link_id) GROUP BY journo 

Надеюсь, это поможет.

+0

Итак, есть способ получить счетчик в том же запросе только для записей, которые соответствуют первой половине запроса, т.е. select count (*) from dan_links, где link_field1 = 'John S' Без меня индивидуальный запрос для этого подсчета? – Dannymh

+0

Один из способов состоит в том, чтобы сначала создать группу на основе link_id, чтобы дублировать записи можно было позаботиться, а затем группировать по результату на основе link_field1, чтобы получить счет. Обновлен ответ с образцом запроса – coder

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