반응형
나는 내가 완전히 붙어 있고 온라인에 대한 답을 찾을 수없는 다소 복잡한 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
반응형
'MySql' 카테고리의 다른 글
MySQL java.lang.ClassNotFoundException : JAR 실행시 com.mysql.jdbc.Driver (0) | 2020.09.24 |
---|---|
MySQL SQL_CACHE 및 SQL_NO_CACHE 사용을위한 MySQL 모범 사례 (0) | 2020.09.24 |
MySQL 자동 증분 기본 키를 사용하여 MySQL에 데이터를 삽입하는 방법은 무엇입니까? (0) | 2020.09.24 |
MySQL 쿼리에서 IF ELSE 문을 작성하는 방법 (0) | 2020.09.24 |
MySQL 알 수없는 테이블 엔진 innodb (0) | 2020.09.24 |
댓글