Ошибка синтаксиса запроса в запросе MySQL - PullRequest
1 голос
/ 30 ноября 2011

Это мой запрос:

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.

Ответы [ 5 ]

2 голосов
/ 30 ноября 2011

Вы пропустили запятую после этого столбца:

`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 избавляют вас от необходимости запускать три дополнительных оператора SELECT для получения одинаковых результатов.

1 голос
/ 30 ноября 2011
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)
1 голос
/ 30 ноября 2011

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

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;

См. Рабочую демонстрацию для этой версии .

1 голос
/ 30 ноября 2011

Неисправно: -

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

Правильно: -

SELECT SUM(`i`.`count`) AS `Count` FROM some_table ...
1 голос
/ 30 ноября 2011

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

...