2

ユーザーとアイテムの2つのテーブルを持つMySQLデータベースがあります。彼らはこのように見えます:

ユーザー:

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

アイテム:

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

特定のIDと名前がキーワードのLIKEであるアイテムのデータベースリストから選択したい。シンプルな検索エンジン用です。私はそのようなクエリを行っています:

SELECT id, user_name, ( SELECT item_name FROM items WHERE id = u.id ) as desc FROM users u WHERE desc LIKE "%shoes%" AND color LIKE "%blue%"

結果として、id = 2、username = dave、itemname =shoesを含む1行が予想されます。これは、クエリを満たす唯一の行だからです。残念ながら、「desc」列がないというメッセージが表示されます。'users'にそのような列がないことは知っていますが、descという名前のサブクエリからそれを取得するようにMySQLに指示するにはどうすればよいですか?

追加の質問:WHERE ... LIKEコマンドとIN(val1、val2、val3)のような配列スタイルで動作することは可能ですか?つまり、loooongクエリの代わりに:

SELECT name 
FROM users 
WHERE name 
LIKE "%john%" OR name 
LIKE "%steven%" OR name LIKE "bob%"

短くする:

SELECT name FROM users WHERE name LIKE IN ( "%john%", "%steven%", "%bob%")

前もって感謝します。

4

4 に答える 4

3

これを試して :

SELECT 
    u.id, u.user_name, i.item_name, i.color
FROM
    users AS u,
    items AS i
WHERE
    i.id = u.id
AND
    i.item_name LIKE "%shoes%" 
AND 
    i.color LIKE "%blue%"

2番目の部分では、 MySQL開発サイトのこのページを見るとREGEXP、代わりに結果を一致させるために使用できることがわかります。そのため、次のLIKEようなものを使用できると思います。

REGEXP 'john|steven|bob'

于 2012-05-01T16:39:18.653 に答える
2

アイテムとの内部結合が必要です。また、descは使えないと思います。代わりに私の答えにdescrを使用しました

これはテストしていませんが、次のことを試してください

SELECT u.id, u.user_name, i.item_name as descr 
FROM users u INNER JOIN items i
ON i.id = u.id
WHERE i.item_name LIKE '%shoes%' 
AND i.color LIKE '%blue%'
于 2012-05-01T16:37:52.307 に答える
1
SELECT *
FROM users u
WHERE
   u.id IN (SELECT id
               FROM items
               WHERE
                  items.id=u.id
               AND
                  color LIKE '%$search%'
               AND
                  item_name LIKE '%$search%'
            )
于 2012-11-26T10:16:51.750 に答える
1

何時間にもわたって正しい構文を検索した後、私は探していたものを見つけました。最良の方法は、正規表現を使用してクエリを複雑にする代わりに、すべての列名を文字列に連結してから、キーワードと同じ数のLIKEで検索することをお勧めします。多分それはエレガントに見えませんが、私には十分です。例:

SELECT user_name, item_name FROM table WHERE CONCAT(user_name, item_name) LIKE '%keyword1%' 

NULLレコードを探します-1つのフィールドのみをnullと連結すると、結果もnullになるため、IFNULL(null_record、'')を使用します。

それが誰かに役立つことを願っています。

于 2012-05-02T18:36:04.033 に答える