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

% 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_eduおよびを含むすべての列参照を参照に限定することもお勧めしますname。(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 に答える
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

2つの重要なポイント:

  1. count()でSQL_CALC_FOUND_ROWS()を使用した場合、その使用法がわかりません。これは同じ望ましい結果をもたらすと思います。
  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 に答える