0

任何人都知道为什么下面的查询会产生错误

“#1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 '%s) 附近使用的正确语法”?

SELECT SQL_CALC_FOUND_ROWS id
FROM (
     SELECT taba.id
FROM (

SELECT alum.id
FROM cvm_education AS edu
JOIN cvm_alumni AS alum ON alum.id = edu.alumni_id
WHERE cvm_alumni.profile_status =1
AND highest_edu
IN (

SELECT name
FROM cvm_filter_educationlevels
JOIN cvm_educationlevel AS edulevels ON educationlevel_id = edulevels.id
WHERE filter_id = % s
)
) AS taba  

干杯!

4

3 回答 3

3

您需要引用字符串值并LIKE用于模式匹配

WHERE filter_id LIKE '% s'

但如果你真的想从% s字面上找到,请使用=

WHERE filter_id = '% s'
于 2013-01-23T16:05:58.353 回答
1

尝试这个:

 SELECT count(taba.id)
FROM (

SELECT alum.id
FROM cvm_education AS edu
JOIN cvm_alumni AS alum ON alum.id = edu.alumni_id
WHERE alum.profile_status =1
AND highest_edu
IN (

SELECT name
FROM cvm_filter_educationlevels
JOIN cvm_educationlevel AS edulevels ON educationlevel_id = edulevels.id
WHERE filter_id = 1
)
) AS taba ; 

http://www.sqlfiddle.com/#!2/f8adc/15

两个重要的点:

  1. 我不理解 SQL_CALC_FOUND_ROWS() 的使用,如果在 count() 中偶然使用它。我认为这提供了相同的预期结果。
  2. 您尚未提供示例数据,因此我无法尝试 %s。我用二进制(1,0)代替了它。此外,我不知道您的确切代码,所以我根据您的查询做了一些假设。

样本数据:

CREATE TABLE cvm_education(
  ID int auto_increment primary key,
  alumni_id int
  );

CREATE TABLE cvm_alumni(
  ID int auto_increment primary key,
  profile_status int,
  highest_edu varchar(30)
  );

CREATE TABLE cvm_filter_educationlevels (
  ID int auto_increment primary key,
  educationlevel_id int,
  name varchar(30)
  );

CREATE TABLE cvm_educationlevel(
  ID int auto_increment primary key,
  filter_id int
  );

INSERT INTO cvm_education (alumni_id)
VALUES (10), (1), (2), (3),(5), (6),(7),(8),(9);

INSERT INTO cvm_alumni (profile_status, highest_edu)
VALUES (1, "master"), 
(0,"bachelor"), 
(1,"bachelor"), 
(0, "master"),
(1, "master"),
(0, "master"),
(1, "master"),
(1, "master"), 
(1, "master"),
(1, "master");

INSERT INTO cvm_filter_educationlevels(educationlevel_id,name)
VALUES (1, "master"), (0,"bachelor");

INSERT INTO cvm_educationlevel(filter_ID)
VALUES (1), (0), (1), (0), (0), (1),(1),(1),(1);
于 2013-01-23T18:15:10.257 回答
1

" % s" 是无效的语法。如果这是文字,则需要将其括在引号中:

WHERE filter_id = '% s'

(但该修复似乎不正确。它几乎看起来好像 MySQL 语句是用 sprintf 生成的,并且打算有一个 ' %s' 占位符,应该用一个值替换。)

此外,语句末尾缺少右括号和别名:

) foo 

和这个:

WHERE cvm_alumni.profile_status = 1

应该改成这样:

WHERE alum.profile_status = 1

(表被分配了一个别名,列引用应该用别名来限定,而不是table_name)

限定所有列引用的引用也是一个好主意,包括educationlevel_id,highest_eduname. (这不一定是语句的问题,除非 MySQL 抛出“模糊列”错误,但我更愿意将我的语句与添加新列时出现的任何“模糊列”错误隔离开。)


SELECT SQL_CALC_FOUND_ROWS id
  FROM (SELECT taba.id
          FROM (
                SELECT alum.id
                  FROM cvm_education edu
                  JOIN cvm_alumni alum
                    ON alum.id = edu.alumni_id
                 WHERE alum.profile_status = 1
                   AND `highest_edu` IN
                       (
                        SELECT `name`
                          FROM cvm_filter_educationlevels
                          JOIN cvm_educationlevel edulevels
                            ON `educationlevel_id` = edulevels.id
                         WHERE `filter_id` = '% s'
                       )
               ) taba
       ) foo

于 2013-01-23T16:31:05.957 回答