1. ホーム
  2. mysql

[解決済み] 複数のwhereステートメントを持つSQLクエリ

2022-03-04 12:36:22

質問

私にとってはかなり複雑なmysqlのクエリを持っていますが、完全に行き詰っており、オンラインで答えを見つけることができません。

以下は私のクエリです。

SELECT
items.*
FROM
items
INNER JOIN
items_meta_data
WHERE
(
        (meta_key = 'lat' AND meta_value >= '55')
    OR
        (meta_key = 'lat' AND meta_value <= '65')
)
AND
(
        (meta_key = 'long' AND meta_value >= '20')
    OR
        (meta_key = 'long' AND meta_value <= '30')
)
GROUP BY
item_id

もちろん、1つのステートメントだけでクエリをテストしましたが、それは問題なく動作しました。つまり、longまたはlatの部分のみを渡すと、結果が得られます。ただ、それらをつなぎ合わせると、異なる結果が得られます。

よろしくお願いします。

テーブルの構成は以下の通りです。

テーブルの項目です。 ID 項目名 項目説明

テーブルメタ。 meta_id アイテムID メタキー メタ値

解決方法

この問題にようやく取り組むことができたので、興味のある方にお知らせします。皆さんのご協力とご教示に感謝します。

SELECT
SQL_CALC_FOUND_ROWS items.* 
FROM
items
INNER JOIN
items_meta ON (items.ID = items_meta.post_id)
INNER JOIN
items_meta AS m1 ON (items.ID = m1.post_id)
WHERE
1=1
AND
items.post_type = 'post'
AND
(items.post_status = 'publish')
AND
( (items_meta.meta_key = 'lat' AND CAST(items_meta.meta_value AS SIGNED) BETWEEN '55'   AND '65')
AND
(m1.meta_key = 'long' AND CAST(m1.meta_value AS SIGNED) BETWEEN '20' AND '30') )
GROUP BY
items.ID
ORDER BY
items.date
DESC

解決方法は?

を考慮する必要があります。 GROUP BY の後に発生します。 WHERE 節条件が評価された。そして WHERE 節は常に1つの行だけを考慮します。つまり、クエリでは meta_key の条件では、常にレコードが選択されないようにします。 1つの列が1つの行に対して複数の値を持つことはできない .

また、冗長なmeta_valueのチェックはどうでしょうか?もしある値が与えられた値より小さくも大きくもなることが許されるなら、その実際の値は全く問題ではなく、チェックを省略することができる。

あるコメントによると、あなたは与えられた場所からある距離以下の場所をチェックしたいようですね。正しい距離を得るためには、実際にはある種の適切な距離関数を使う必要があります。 この質問 をご覧ください。) しかし、このSQLは、どのように始めればよいかを教えてくれるはずです。

SELECT items.* FROM items i, meta_data m1, meta_data m2
    WHERE i.item_id = m1.item_id and i.item_id = m2.item_id
    AND m1.meta_key = 'lat' AND m1.meta_value >= 55 AND m1.meta_value <= 65
    AND m2.meta_key = 'lng' AND m2.meta_value >= 20 AND m2.meta_value <= 30