본문 바로가기
MySql

MySQL 여러 where 문이있는 SQL 쿼리

by 베이스 공부 2020. 9. 24.
반응형

나는 내가 완전히 붙어 있고 온라인에 대한 답을 찾을 수없는 다소 복잡한 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

물론 나는 단 하나의 문으로 쿼리를 테스트했으며 잘 작동합니다. 따라서 길거나 위도 부분 만 통과하면 결과를 얻습니다. 함께 꿰매려고 할 때만 다른 결과를 얻습니다.

미리 도와 주셔서 감사합니다!

테이블 구조는 다음과 같습니다.

테이블 항목 : ID item_name 항목 설명

표 메타 : meta_id item_id meta_key 메타 _ 값

솔루션

관심있는 사람에게 마침내이 문제를 해결할 수있었습니다. 여러분의 도움과 내부에 감사드립니다.

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

 

해결 방법

 

WHERE 절 조건이 평가 된 후에 GROUP BY 가 발생한다는 점을 고려해야합니다. 그리고 WHERE 절은 항상 하나의 행만 고려합니다. 즉, 쿼리에서 meta_key 조건은 한 열이 한 행에 여러 값 .

그리고 중복 된 meta_value 검사는 어떻습니까? 값이 주어진 값보다 작거나 클 수 있도록 허용되는 경우 실제 값은 전혀 문제가되지 않으며 검사를 생략 할 수 있습니다.


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

 

참조 페이지 https://stackoverflow.com/questions/8645773

 

 

반응형

댓글