【问题标题】:MYSQL | Getting syntax error for using subquery in COUNT()MYSQL |在 COUNT() 中使用子查询时出现语法错误
【发布时间】:2015-02-14 09:13:48
【问题描述】:
SELECT 
E.`employee_id`,
E.`full_name`,
LE.`no_of_leaves` AS AllocatedLeaves,
MLLT.`leave_type` AS LeaveTypeName,
COUNT(SELECT * FROM leave_approval WHERE employee_id = 1) AS TotalLeavesTaken
FROM employee E
INNER JOIN leave_entitlement LE
ON E.`employee_id` = LE.`employee_id`
INNER JOIN `ml_leave_type` MLLT
ON MLLT.`ml_leave_type_id` = LE.`ml_leave_type_id`
LEFT JOIN leave_approval LA
ON E.`employee_id` = LA.`employee_id`
LEFT JOIN leave_application LAPP
ON LAPP.`application_id` = LA.`leave_application_id`
LEFT JOIN ml_leave_type MLLTLA
ON MLLTLA.`ml_leave_type_id` = LAPP.`ml_leave_type_id`

我在计数附近遇到语法错误,但我试图找出语法错误但我找不到任何?

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 * from leave_approval where employee_id = 1) AS TotalLeavesTaken
from emp' at line 6

真的是语法错误吗。还是我在这里遗漏了什么??

【问题讨论】:

    标签: mysql sql select count group-by


    【解决方案1】:

    改变

    COUNT(SELECT * FROM leave_approval WHERE employee_id = 1) AS TotalLeavesTaken
    

    到

     (SELECT count(*) FROM leave_approval WHERE employee_id = 1) AS TotalLeavesTaken
    

    【讨论】:

      【解决方案2】:

      这一行:

      COUNT(SELECT * FROM leave_approval WHERE employee_id = 1) AS TotalLeavesTaken
      

      不正确。如果不将select * 子查询放在括号中,您将无法对其进行计数,但即便如此,您也需要group by 和其他逻辑。更好的方法是:

      (Select count(*) from leave_approval where employee_id = 1) AS TotalLeavesTaken
      

      【讨论】:

      • 感谢您的快速回答。完美的答案..问题解决了.. :)
      【解决方案3】:

      在您的情况下,无需使用子查询进行计数,请检查以下查询

      试试这个:

      SELECT E.employee_id, E.full_name, LE.no_of_leaves AS AllocatedLeaves,
             MLLT.leave_type AS LeaveTypeName,
             SUM(CASE WHEN LA.employee_id = 1 THEN 1 ELSE 0 END) AS TotalLeavesTakenByEmplyeeNo1
      FROM employee E
      INNER JOIN leave_entitlement LE ON E.employee_id = LE.employee_id
      INNER JOIN `ml_leave_type` MLLT ON MLLT.ml_leave_type_id = LE.ml_leave_type_id
      LEFT JOIN leave_approval LA ON E.employee_id = LA.employee_id
      LEFT JOIN leave_application LAPP ON LAPP.application_id = LA.leave_application_id
      LEFT JOIN ml_leave_type MLLTLA ON MLLTLA.ml_leave_type_id = LAPP.ml_leave_type_id
      GROUP BY E.employee_id;
      

      【讨论】:

        【解决方案4】:

        试试这个查询

        SELECT E.`employee_id`,E.`full_name`,LE.`no_of_leaves` AS AllocatedLeaves,MLLT.`leave_type` AS LeaveTypeName,
        SUM( CASE WHEN LA.employee_id = '1' THEN 1 ELSE 0 END ) as TotalLeavesTaken
        FROM employee E
        INNER JOIN leave_entitlement LE
        ON E.`employee_id` = LE.`employee_id`
        INNER JOIN `ml_leave_type` MLLT
        ON MLLT.`ml_leave_type_id` = LE.`ml_leave_type_id`
        LEFT JOIN leave_approval LA
        ON E.`employee_id` = LA.`employee_id`
        LEFT JOIN leave_application LAPP
        ON LAPP.`application_id` = LA.`leave_application_id`
        LEFT JOIN ml_leave_type MLLTLA
        ON MLLTLA.`ml_leave_type_id` = LAPP.`ml_leave_type_id`

        只有你必须将 COUNT(SELECT * FROM leave_approval WHERE employee_id = 1) 替换为 SUM(CASE WHEN LA.employee_id = '1' THEN 1 ELSE 0 END)

        谢谢,试试这个,因为我已经尝试过这个查询,它会给你完美的结果

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 1970-01-01
          • 2013-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多