0

MySQL で複数引数の検索クエリを実行すると問題が発生します。

    SELECT item.* from item, attr, attr_xref
    WHERE attr_xref.item = item.id
    AND attr.id = attr_xref.attrID
    AND (
      (attr.name = 'city' AND attr.val LIKE '%new york%')
      OR
      (attr.name = 'floor' AND attr.val = 6)
    )

クエリはphpで動的に生成されますが、問題はありません。

問題は、このクエリが厳密な検索を返さないことです。都市または階のいずれかが検索値と等しいアイテムが返されます。

ご覧のとおり、問題はここにあります。AND attr.id = attr_xref.attrIDこの行は、複数の属性を持つアイテムに対して複数の値を返し、OR演算子を削除します。単一の属性を複数の異なる名前と値に一致させようとしますが、ID は 1 つにします。

これを克服する方法はありますか?

これは生の例であり、実行時に 2.3 を超える検索引数を使用する場合があります。

ありがとう、あなたの助けを楽しみにしています!

編集: 受け入れられた回答に投稿されたSQLクエリを使用して機能し、これを追加しました:

AND (a_city.id IS NOT NULL
OR a_floor.id IS NOT NULL)
GROUP BY imobil.id
HAVING COUNT(*) = 2

結果をグループ化してカウントしたい場合、'= 2' は渡された引数の数を意味し、これは PHP でカウントされます。ありがとうございます。問題がある場合は、この質問を読みたいと思うかもしれません

4

1 に答える 1

1

「floor」の attr.val を持つ 1 つの列と「city」の attr.val を持つ別の列を作成する 2 つの左結合を追加し、少なくとも 1 つが null でないことを確認します。

このようなもの:

SELECT 
    item.*
FROM 
    item
JOIN 
    attr_xref ON attr_xref.item = item.id
LEFT JOIN 
    attr a_city ON  a_city.id = attr_xref.attrID 
                AND a_city.name = 'city'
                AND a_city.val LIKE '%new york%'
LEFT JOIN
    attr a_floor ON a_floor.id = attr_xref.attrID
                AND a_floor.name = 'floor'
                AND a_floor.val = 6 
WHERE 
    a_city.id IS NOT NULL 
    OR a_floor.id IS NOT NULL

私はそれをテストしませんでしたが、これに似たアプローチがうまくいくかもしれません。

于 2012-04-08T17:06:20.263 に答える