2016-10-09 7 views
1

他のテーブルから引き出された情報と指定された変数に基づいて情報をリレーショナルテーブルに格納する複雑なINSERTクエリがあります。名前がMr. John SmithまたはJohn Smith PH.d可能性があるためORDER BYの列を選択して、結果に戻さない

INSERT INTO relational (class_id, teacher_id, student_id) 
VALUES (
    (SELECT `id`, 
     (`name` = "John Smith") as exact_score, 
     (`name` RLIKE "[[:<:]]John Smith[[:>:]]") as reg_score, 
     (MATCH (`name`) AGAINST ("John Smith")) as match_score 
    FROM `teachers` 
    WHERE (`title` RLIKE "[[:<:]]John Smith[[:>:]]" || MATCH (`title`) AGAINST ("John Smith")) 
    ORDER BY 
     CASE WHEN exact_score = 1 THEN exact_score END DESC, 
     CASE WHEN reg_score > 1 THEN reg_score END DESC, 
     CASE WHEN reg_score = 0 AND exact_score = 0 THEN match_score END DESC), 
1, 1); 

正規表現が必要とされ、保存された名前は、実際にはJohn Smithある場合は名前がjon smith可能性があるため、一致が必要となります。

は、ここでのクエリです。

選択クエリは、私は、時間の90%を探していた結果が得られますが、私はそれから必要な唯一の本当のidです。私が実行している問題は、INSERTの期待される列数と、クエリによって返される列数との比較です。

は今INSERTは、基本的には、次のようになります。

INSERT INTO relational (class_id, teacher_id, student_id) VALUES ({{returned id (desired)}}, {{exact score (undesired)}}, {{reg score (undesired)}}, {{match score (undesired)}}, 1, 1); 

最後1, 1は変数によって提供されます。

私の質問は、ORDER BYのために列を選択する方法ですが、結果からそれらを省略することはできますか?

答えて

2

列がテーブル/ビューで定義されている場合は、ORDER BYで使用し、結果から省略できます。しかし、あなたの場合、計算列ORDER BYに使用しているので、これらの列を省略したい場合は、ORDER BYに対応する式で置き換える必要があります。

ORDER BY 
    CASE WHEN (`name` = "John Smith") = 1 THEN (`name` = "John Smith") END DESC 
    -- etc... 

これは良い解決策ではないと思います。代わりに、サブクエリを使用する方が良い:

INSERT INTO relational (class_id, teacher_id, student_id) 
SELECT id,1,1 FROM 
    (SELECT `id`, 
     (`name` = "John Smith") as exact_score, 
     (`name` RLIKE "[[:<:]]John Smith[[:>:]]") as reg_score, 
     (MATCH (`name`) AGAINST ("John Smith")) as match_score 
    FROM `teachers` 
    WHERE (`title` RLIKE "[[:<:]]John Smith[[:>:]]" || MATCH (`title`) AGAINST ("John Smith")) 
    ORDER BY 
     CASE WHEN exact_score = 1 THEN exact_score END DESC, 
     CASE WHEN reg_score > 1 THEN reg_score END DESC, 
     CASE WHEN reg_score = 0 AND exact_score = 0 THEN match_score END DESC) 
    AS t1; 
関連する問題