2011-11-30 1 views
1

Это мой запрос:запроса синтаксическая ошибка в запросе MySQL

SELECT 
    `i`.`itemtype` AS `Item`, 
    `p`.`name` 
    (SELECT SUM(`i`.`count`) AS `Count` WHERE `itemtype` = 2148), 
    (SELECT SUM(`i`.`count`) * 100 AS `Count1` WHERE `itemtype` = 2152), 
    (SELECT SUM(`i`.`count`) * 10000 AS `Count2` WHERE `itemtype` = 2160) 
FROM `player_items` AS `i` 
LEFT JOIN `players` AS `p` ON (`p`.`id` = `i`.`player_id`) 
WHERE `i`.`itemtype` IN (2148, 2152, 2160) 
GROUP BY `i`.`itemtype` 
LIMIT 0, 30 

Когда я запускаю выше запрос в MySQL, я получаю сообщение об ошибке:

#1064 - You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 
'SELECT SUM(`i`.`count`) AS `Count` WHERE `itemtype` = 2148) 
    , (SELECT SUM(`i`' at line 4 

Я совершенно не понимаю, что это означает, что я начинаю в MySQL.

ответ

2

Вы пропустили запятую после этой колонки:

`p`.`name` 

Рассмотрим этот запрос вместо:

SELECT i.itemtype AS Item 
    , p.name 
    , SUM(CASE 
      WHEN itemtype = 2148 THEN i.count 
      ELSE 0 
     END) AS Count 
    , SUM(CASE 
      WHEN itemtype = 2152 THEN i.count 
      ELSE 0 
     END) * 100 AS Count1 
    , SUM(CASE 
      WHEN itemtype = 2160 THEN i.count 
      ELSE 0 
     END) * 10000 AS Count2 
FROM player_items AS i 
LEFT JOIN players AS p ON i.player_id = p.id 
WHERE i.itemtype IN (2148, 2152, 2160) 
GROUP BY i.itemtype ASC 
LIMIT 0, 30 

просуммировать эти три колонки вместе, вы можете:

SELECT t.itemType AS Item, t.Count, t.Count1, t.Count2 
    , SUM(t.Count1, t.Count2, t.Count3) AS Total 
FROM 
(
    SELECT i.itemtype AS Item 
     , p.name 
     , SUM(CASE 
       WHEN itemtype = 2148 THEN i.count 
       ELSE 0 
      END) AS Count 
     , SUM(CASE 
       WHEN itemtype = 2152 THEN i.count 
       ELSE 0 
      END) * 100 AS Count1 
     , SUM(CASE 
       WHEN itemtype = 2160 THEN i.count 
       ELSE 0 
      END) * 10000 AS Count2 
    FROM player_items AS i 
    LEFT JOIN players AS p ON i.player_id = p.id 
    WHERE i.itemtype IN (2148, 2152, 2160) 
    GROUP BY i.itemtype ASC 
    LIMIT 0, 30 
) AS t 

Или вы могли бы добавить еще CASE

SELECT i.itemtype AS Item 
    , p.name 
    , SUM(CASE 
      WHEN itemtype = 2148 THEN i.count 
      ELSE 0 
     END) AS Count 
    , SUM(CASE 
      WHEN itemtype = 2152 THEN i.count 
      ELSE 0 
     END) * 100 AS Count1 
    , SUM(CASE 
      WHEN itemtype = 2160 THEN i.count 
      ELSE 0 
     END) * 10000 AS Count2 
    , SUM(CASE 
      WHEN itemtype = 2148 THEN i.count 
      WHEN itemtype = 2152 THEN (i.count * 100) 
      WHEN itemtype = 2160 THEN (i.count * 10000) 
      ELSE 0 
     END) AS Total 
FROM player_items AS i 
LEFT JOIN players AS p ON i.player_id = p.id 
WHERE i.itemtype IN (2148, 2152, 2160) 
GROUP BY i.itemtype ASC 
LIMIT 0, 30 

CASE statements делает ненужным для вам нужно запустить три дополнительных оператора SELECT, чтобы вернуть те же результаты.

+0

Спасибо за хорошее решение. Btw. возможно ли «СУММ» вместе «Count», «Count1» и «Count2» в другой строке? – Cyclone

+0

@Cyclone Я обновил свой ответ, чтобы ответить на вопрос в вашем комментарии. –

+0

Спасибо :-))). – Cyclone

1

во всех ваших SELECT SUM(...) вы не определите FROM player_items AS i

1

Неисправный: -

SELECT SUM(`i`.`count`) AS `Count` <-- missing FROM which table 

Правильно: -

SELECT SUM(`i`.`count`) AS `Count` FROM some_table ... 
1

Я полагаю, вы хотите что-то вроде этого:

SELECT p.name 
     ,i.itemtype 
     ,CASE itemtype 
     WHEN 2148 THEN count(*) 
     WHEN 2152 THEN count(*) * 100 
     WHEN 2160 THEN count(*) * 10000 
     END AS ct 
FROM players p 
LEFT JOIN player_items i ON p.id = i.player_id 
WHERE i.itemtype IN (2148, 2152, 2160) 
GROUP BY p.name, i.itemtype 
ORDER BY p.name, i.itemtype 
LIMIT 30; 

Или, может быть, это:

SELECT p.name 
     ,sum(CASE WHEN itemtype = 2148 THEN 1 ELSE 0 END) AS ct 
     ,sum(CASE WHEN itemtype = 2152 THEN 1 ELSE 0 END) * 100 AS ct1 
     ,sum(CASE WHEN itemtype = 2160 THEN 1 ELSE 0 END) * 10000 AS ct2 
FROM players p 
LEFT JOIN player_items i ON p.id = i.player_id 
WHERE i.itemtype IN (2148, 2152, 2160) 
GROUP BY p.name 
ORDER BY p.name 
LIMIT 30; 

working demo for this version См.

1
SELECT 
    `i`.`itemtype` AS `Item`, 
    `p`.`name *<{miss ','}>* 
    (SELECT SUM(`i`.`count`) AS `Count` *<miss from 'table'>* WHERE `itemtype` = 2148), 
    (SELECT SUM(`i`.`count`) * 100 AS `Count1` *<miss from 'table'>* WHERE `itemtype` = 2152), 
    (SELECT SUM(`i`.`count`) * 10000 AS `Count2` *<miss from 'table'>* WHERE `itemtype` = 2160) 

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

  • Нет связанных вопросов^_^