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

したがって、どのテーブルまたはフィールドにいるかに関係なく、「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 つの結果のみが必要ですが、最も関連性の高いユーザーが最初にリストされます。それ、どうやったら出来るの?

4

1 に答える 1

1

質問 1) に答えるには、次のように置き換えます。

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

REGEXP '(a|b)'

次に、 true の場合は 1 を返し、falseのa REGEXP b場合は 0を返します。これを試して:CASEORDER 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) に答える。LIKEandREGEXPでさえ、MySQLではデフォルトで大文字と=小文字が区別されません。大文字と小文字を区別する検索を実行するには、次のいずれかが必要です。CHARVARCHARTEXT

  1. BINARYキーワードを追加します。例えば:REGEXP BINARY '(a|b)'

  2. フィールド タイプをBINARYまたはVARBINARY、またはに変更しますBLOB

  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 に答える