Запрос MySQL с помощью SUM () не возвращает ожидаемых результатов - PullRequest
1 голос
/ 02 августа 2011

Запрос:

SELECT 
    id_data,
    id_tag IN (75) AS tag1,
    id_tag IN (12) AS tag2,
    SUM(id_tag IN (75, 12)) summedTags
FROM
    tags_inservice
WHERE id_service = 1 
GROUP BY id_data 
ORDER BY summedTags DESC

Результат:

id_data    tag1    tag2  summedTags
-------  ------  ------  ----------
   3109       0       1           2
   1956       0       0           2
   1928       0       0           1
   2738       1       0           1

Что я считаю неправильным:

summedTags редко соответствует фактической сумме тегов!В примере id_data 3109 имеет 0 + 1 = 2, что неверно, а id_data 1956 показывает 0 + 0 = 2, что тоже неправильно, и т. Д., И т. Д. Что я делаю неправильно?

Кстати, я также попытался добавить HAVING SUM(id_tag IN (75, 12)) = 2 с похожими результатами.

Еще немного дополнительной информации, если вам это нужно:

У меня есть таблица tags_inservice, которая содержит кучуданных (представленных id_data, идентификатором из другой таблицы), и данные могут быть помечены различными тегами.Id_data может иметь ноль или более id_tags, поэтому может быть несколько строк с одинаковым значением id_data.На самом деле, иногда допустимо, чтобы одни и те же id_data отмечались одним и тем же id_tag ​​более одного раза.

DESCRIBE tags_inservice;

Field       Type     Null    Key     Default  Extra         
----------  -------  ------  ------  -------  --------------
id_intag    int(11)  NO      PRI     (NULL)   auto_increment
id_tag      int(11)  YES     MUL     (NULL)                 
id_service  int(11)  YES     MUL     (NULL)                 
data_type   int(11)  YES             (NULL)                 
id_data     int(11)  YES     MUL     (NULL)                 

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

кажется, что проблема вызвана группой, поскольку summedTags - это случаи id_data

SELECT 
id_data,
sum(if (id_tag=75,1,0)) as tag1,
sum(if (id_tag=12,1,0)) as tag2,
sum(if (id_tag in(12,75),1,0)) as summedTags
FROM tags_inservice
WHERE id_service = 1 
GROUP BY id_data 
ORDER BY summedTags DESC;
0 голосов
/ 02 августа 2011

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

SELECT 
    id_data,
    CASE WHEN id_tag = 75 THEN 1 ELSE 0 END as tag1 , // id_tag IN (75) AS tag1,
    CASE WHEN id_tag = 12 THEN 1 ELSE 0 END AS tag2 , // id_tag IN (12) AS tag2,
    SUM (CASE WHEN id_tag = 75 OR id_tag = 12 THEN 1 ELSE 0 END) AS summedTags
FROM
    tags_inservice
WHERE id_service = 1 
GROUP BY id_data 
ORDER BY summedTags DESC
  • Не гарантирует правильность синтаксиса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...