0

mysql db で正しいクエリを探しています。テーブルがあるとしましょう:

ユーザー:

id | user_name | desc
--------------------------
1  | john      | tall
2  | john      | fat
3  | maria     | pretty

アイテム:

id | item_name | color
--------------------------
1  | trousers  | red
2  | shoes     | blue
3  | shoes     | red

私の検索エンジンはデータベースを検索して、クエリで結果を選択します:

SELECT i.item_name, i.color, u.user_name, u.desc 
FROM users u, items i 
WHERE u.id = i.id 
   AND item_name REGEXP $keywords 
   AND user_name REGEXP $keywords

変数 $keywords は次のようになります。

$keywords = explode(' ', $_POST['keywords']);
$keywords = implode('|', $keywords);

$keywords = 'john trousers' の場合、すべて正常に動作します。id = 1 のユーザーを取得します。問題ありません。しかし、$keywords = 'john' を設定すると、空の文字列が返されます。その理由もわかっています。item_name に「john」がないため、AND 条件が false を返します。問題は: $keywords = "john trousers" で user = 1 を返し、$keyword = 'john' が id = 1 と id = 2 の 2 行を取得する正しい正規表現は何ですか?

前もって感謝します。

4

1 に答える 1

1

検索値として列の値を使用して(およびLIKEの代わりに使用してREGEXP)、比較を逆にすることができます。

SELECT i.item_name, i.color, u.user_name, u.desc 
FROM users u, items i 
WHERE u.id = i.id 
AND $keywords like concat('%', item_name, '%')
AND $keywords like concat('%', user_name, '%')

これは適切なアプローチですが、列の値全体keywordsが含まれている場合にのみ機能することに注意してください。より洗練された比較を行うには、値の分割などを試す必要があります(独自の調査を行う必要があります)

于 2012-05-02T00:10:18.673 に答える