MYSQL сумма покупок предметов и их «за» / «против» голосов умножается на коэффициент 22? - PullRequest
1 голос
/ 01 апреля 2012

Я пытаюсь подсчитать количество покупок и голосов «за» / «против» для всех товаров, которые соответствуют заданному поисковому запросу. К сожалению, поскольку я настроил свой запрос сейчас, количество покупок и голосов умножается на таинственный коэффициент 22, который я не могу понять, откуда он.

В качестве примера для одного из пунктов: голоса за покупки, за и против должны составлять 7, 2 и 1 соответственно, но вместо этого они составляют 154, 44 и 22.

вот мой код SQL:

SELECT *
sum(purchaseyesno) as tots,
sum(rating=1) as yes,
sum(rating=0) as no
from items
join items_purchased
on items_purchased.item_id=items.item_id
join accounts 
on items.account_id=accounts.account_id 
like subject='%album by joe%' or description='%album by joe%'
group by item_id
order by tots desc, yes desc

Вот некоторые примеры данных:

subject        tots   yes   no   full_name 
album by joe    154    44   22    joe smith
album by fred   88     44   0    fred jones

Вот как я хотел бы, чтобы данные выглядели:

subject        tots   yes   no   full_name 
album by joe    7      2    1    joe smith
album by fred   4      2    0    fred jones

Может ли кто-нибудь помочь мне разобраться, что здесь происходит? Я не могу понять этот коэффициент 22, который сохраняется, несмотря на изменение group by и других вещей (то есть, это число 22 не зависит от # возвращаемых строк).

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

Вы не показываете свою схему, но это может помочь в использовании подзапроса:

SELECT subject, tots, yes, no, fullnane
  FROM (
    SELECT item_id, SUM(purchaseyesno) AS tots, SUM(rating=1) AS yes, SUM(rating=0) AS no
    FROM items_purchased
    GROUP BY item_id
  ) i
  JOIN items ON i.item_id = items.item_id
  JOIN accounts ON items.account_id=accounts.account_id 
  WHERE subject LIKE '%album by joe%' OR description LIKE '%album by joe%'
  ORDER BY tots DESC, yes DESC
0 голосов
/ 02 апреля 2012

Во-первых, не делайте select *, если вы группируете по. Помните, что вы должны группировать по всем неагрегированным полям.

Во-вторых, большое количество результатов должно исходить от этих объединений. Удалите группу и объединенные столбцы и просмотрите результаты, и вы поймете, почему вы получаете столько записей.

Наконец ... вы пропускаете предложение where там ...

0 голосов
/ 02 апреля 2012
SELECT subject,
sum(purchaseyesno)/22 as tots,
sum(CASE WHEN rating=1 THEN 1 END)/22 as yes,
sum(CASE WHEN rating=0 THEN 1 END)/22 as no,
full_name
from items
join items_purchased
on items_purchased.item_id=items.item_id
join accounts 
on items.account_id=accounts.account_id 
like subject='%album by joe%' or description='%album by joe%'
group by subject,full_name
order by tots desc, yes desc

В этом запросе функция SUM в основном работает со столбцами buyyesno, rating = 1, rating = 0.

Например,

Subject purchaseyesno rating full_name 
1       5             1      Mark
1       6             0      Mark
2       7             1      Robert
2       8             0      Robert

Приведенный выше запросвернитесь, как показано ниже.

Subject tots yes no full_name 
1       11   1   1  Mark
2       15   1   1  Robert
...