2015-11-04 38 views
2

我有以下查询我想要做的是控制SELECT CASEEND AS并检查另一个条件。MySql如何通过`IF`或另一个`CASE`检查`CASE`语句的`END AS`

set @lang = 'pr'; 

select 
    COUNT(t1.id) as total, 
    COUNT(t1.id) as 'Total', 
    CASE t2.`precence` 
     WHEN '0' THEN 'Absent' 
     WHEN '1' THEN 'Present' 
     ELSE 'Unknown' 
    END AS series, 
    CONCAT(DAYNAME(t1.date),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS ticks, 
    CONCAT(DATE_FORMAT(t1.date, '%a'),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS abv, 
    courses.no AS label, 
    CASE t2.`precence` 
     WHEN '0' THEN IF(@lang = 'en','Absent Participant',IF(@lang = 'pr','غیر حاضر',IF(@lang = 'pa','test','unkown'))) 
     WHEN '1' THEN IF(@lang = 'en','Present Participant',IF(@lang = 'pr','حاضر',IF(@lang = 'pa','حاضر','unkown'))) 
     ELSE IF(@lang = 'en','Unknown State',IF(@lang = 'pr','نامعلوم',IF(@lang = 'pa','نامعلوم','unkown'))) 
    END AS IF(@lang = 'en','Attendance Status',IF(@lang = 'pr','وضعیت حاضری',IF(@lang = 'pa','وضعیت حاضری','Attendance State')))), 
    CONCAT(DAYNAME(t1.date),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS IF(@lang = 'en','Attendance Date',IF(@lang = 'pr','تاریخ حاضری',IF(@lang = 'pa','تاریخ حاضری','Attendance Date'))), 
    CONCAT(DATE_FORMAT(t1.date, '%a'),' ',DATE_FORMAT(t1.date,'%Y %M %d')) AS 'Attendance Date (abv)', 
    courses.no AS 'Course Number' 

FROM course_attendances as t1 left join `student_attendances` as t2 on t2.`course_attendance_id` = t1.`id` 
RIGHT JOIN courses ON courses.id = t1.course_id 
WHERE t1.`course_id` = '1' AND t1.date BETWEEN '2015-01-01' AND '2016-11-17' 
GROUP BY t1.`date`,t2.`precence` 

CASE语句查询停止END AS部分和显示的查询是错误的,我怎么能解决。

+0

使用13.5 SQL语法用于预处理语句(http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html)。 – wchiquito

+0

@wchiquito如何使用PHP变量而不是mysql变量 – jones

回答

1

SQL不允许您使用IF语句控制“AS”子句的列名。在这种情况下,AS后面的单词必须是简单的列名。

SQL查询生成列名称和数据类型在分析查询时定义的列,而不是查询运行时。

0

一种选择是:

mysql> SET @`_lang` := 'pr'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SET @`qry` := CONCAT(' 
    > SELECT 
    >  CASE 
    >  WHEN 1 > 0 THEN \'true\' 
    >  ELSE \'false\' 
    >  END AS `', IF(@`_lang` = 'en', 'Attendance Status', 
    ->     IF(@`_lang` = 'pr', 'وضعیت حاضری', 
    ->     IF(@`_lang` = 'pa', 'وضعیت حاضری', 
    ->      'Attendance State' 
    ->     ) 
    ->     ) 
    ->    ), '`' 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> PREPARE `stmt` FROM @`qry`; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

mysql> EXECUTE `stmt`; 
+-----------------------+ 
| وضعیت حاضری   | 
+-----------------------+ 
| true     | 
+-----------------------+ 
1 row in set (0.00 sec) 

mysql> DEALLOCATE PREPARE `stmt`; 
Query OK, 0 rows affected (0.00 sec) 

记住,AS is optional,看到13.2.9 SELECT Syntax

SQL Fiddle demo