私は高度なmysqlクエリを初めて使用するので、ここで親切にしてください...
次のテーブルがあると仮定しましょう...
Table Name: users
username other_non_relevant_field
======== ========================
Bob blah blah blah
Steve blah blah blah
Adam blah blah blah
Table Name: table_1
username field_abc field_def other_non_relevant_field
======== ========= ========= ========================
Steve quick brown blah blah blah
Adam fox quick blah blah blah
Table Name: table_2
username field_ghi field_jkl other_non_relevant_field
======== ========= ========= ========================
Bob fox fox blah blah blah
Bob brown quick blah blah blah
Steve fox lazy blah blah blah
Adam jump dog blah blah blah
したがって、どのテーブルまたはフィールドにいるかに関係なく、「quick」または「brown」という単語を含むレコードを持つすべてのユーザーのリストを返し、関連性に従って結果を表示するとします。そのために、次のクエリを使用します。
SELECT users.username, table_1.field_abc, table_1.field_def,
table_2.field_ghi, table_2.field_jkl
FROM users
JOIN table_1 ON ( table_1.username=users.username )
JOIN table_2 ON ( table_2.username=users.username )
WHERE
table_1.field_abc LIKE "%quick%" OR table_1.field_abc LIKE "%brown%"
OR
table_1.field_def LIKE "%quick%" OR table_1.field_def LIKE "%brown%"
OR
table_2.field_ghi LIKE "%quick%" OR table_2.field_ghi LIKE "%brown%"
OR
table_2.field_jkl LIKE "%quick%" OR table_2.field_jkl LIKE "%brown%"
ORDER BY (
(
CASE WHEN table_1.field_abc LIKE "%quick%"
THEN 1
ELSE 0
END
) + (
CASE WHEN table_1.field_abc LIKE "%brown%"
THEN 1
ELSE 0
END
) + (
CASE WHEN table_1.field_def LIKE "%quick%"
THEN 1
ELSE 0
END
) + (
CASE WHEN table_1.field_def LIKE "%brown%"
THEN 1
ELSE 0
END
) + (
CASE WHEN table_2.field_ghi LIKE "%quick%"
THEN 1
ELSE 0
END
) + (
CASE WHEN table_2.field_ghi LIKE "%brown%"
THEN 1
ELSE 0
END
) + (
CASE WHEN table_2.field_jkl LIKE "%quick%"
THEN 1
ELSE 0
END
) + (
CASE WHEN table_2.field_jkl LIKE "%brown%"
THEN 1
ELSE 0
END
)
) DESC;
私は今、いくつかの問題を抱えています...
1) クエリがかなり長いようです。それを行う簡単な方法はありますか?
2) %qUiCk% が引き続き結果を返すように、LIKE の大文字と小文字を区別しないようにするにはどうすればよいですか?
3) 現在、関連するすべてのレコードが返されます。ただし、実際にはユーザーごとに 1 つの結果のみが必要ですが、最も関連性の高いユーザーが最初にリストされます。それ、どうやったら出来るの?