0

我是高级 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) 目前已返回所有相关记录;但是,我实际上只希望每个用户有一个结果,但最相关的用户首先列出。我怎么做?

4

1 回答 1

1

要回答问题 1),您可以替换

LIKE '%a%' OR LIKE '%b%'

REGEXP '(a|b)'

其次,a REGEXP b如果为真则返回 1,如果为假则返回 0,因此您可以删除CASE. ORDER BY尝试这个:

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 REGEXP "(quick|brown)" OR
    table_1.field_def REGEXP "(quick|brown)" OR
    table_2.field_ghi REGEXP "(quick|brown)" OR
    table_2.field_jkl REGEXP "(quick|brown)"
ORDER BY (
    (table_1.field_abc REGEXP "(quick|brown)") +
    (table_1.field_def REGEXP "(quick|brown)") +
    (table_2.field_ghi REGEXP "(quick|brown)") +
    (table_2.field_jkl REGEXP "(quick|brown)")
) DESC;

回答问题 2)。LIKEand REGEXPand even=默认情况下在 MySQL 中不区分大小写,forCHARVARCHAR字段TEXT。要执行区分大小写的搜索,您需要:

  1. 添加BINARY关键字。例如:REGEXP BINARY '(a|b)'

  2. 将字段类型更改为BINARYor VARBINARY, orBLOB

  3. 将您正在搜索的字段的字符排序规则更改为区分大小写的排序规则。

要回答问题 3),您需要添加一个GROUP BY子句,例如:

SELECT users.username, SUM(
    (table_1.field_abc REGEXP "(quick|brown)") +
    (table_1.field_def REGEXP "(quick|brown)") +
    (table_2.field_ghi REGEXP "(quick|brown)") +
    (table_2.field_jkl REGEXP "(quick|brown)")
) hits,
    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 REGEXP "(quick|brown)" OR
    table_1.field_def REGEXP "(quick|brown)" OR
    table_2.field_ghi REGEXP "(quick|brown)" OR
    table_2.field_jkl REGEXP "(quick|brown)"
GROUP BY
    users.username
ORDER BY (
    (table_1.field_abc REGEXP "(quick|brown)") +
    (table_1.field_def REGEXP "(quick|brown)") +
    (table_2.field_ghi REGEXP "(quick|brown)") +
    (table_2.field_jkl REGEXP "(quick|brown)")
) DESC;
于 2013-04-11T16:43:31.663 回答