我是高级 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
因此,假设我要返回所有用户的列表,这些用户的记录包含“快速”或“棕色”,无论他们在哪个表或字段中,并根据相关性显示结果。为此,我使用以下查询:
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)如何使 LIKE 不区分大小写,以便 %qUiCk% 仍会返回结果?
3) 目前已返回所有相关记录;但是,我实际上只希望每个用户有一个结果,但最相关的用户首先列出。我怎么做?