2012-09-23 2 views
0

현재 Wordpress 용 WP-Property 플러그인을 사용하는 사이트에서 작업하고 있습니다.MySQL - 단일 열에서 여러 값 쿼리

기본적으로 특정 가격대의 텍스트 검색 링크 옆에 카운터를 표시하려고합니다.

다음은 내가 실행중인 쿼리로 가격 범위는 완벽하게 계산됩니다.

$apartprice1 = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->postmeta WHERE meta_value BETWEEN 50000 AND 74999"); 
if (0 < $apartprice1) $apartprice1 = number_format($apartprice1); 

그러나 나는이 특정 가격 범위 내에서 만 "아파트"를 표시하려면이 확장하고 싶습니다. 이제 meta_value 열 내에 속성 유형 값 (아파트, 주택, 유보금)도 저장됩니다.

제발 나를 비방 할 수있는 사람은 누구입니까?

편집 : 아래의 몇 가지 더 정교 :

Table name is postmeta 

meta_id  post_id  meta_key  meta_value 

348   41   property_type apartment 
358   41   price   698000 

그래서 나는 또한 당신이 경우 특정 속성 유형

+0

"meta_value' 열에는 속성 유형 값 (아파트, 주택, 프리 홀드)도 저장됩니다." - 적어도, 예제를 제공 할 수 있습니다. 나는 이것을 어떻게 만들지 전혀 모른다. –

+0

테이블 구조를 제공 할 수 있습니까? –

+0

@ChrisHenry 편집의 중간에 있었으므로 충분합니까? – Plastika

답변

0

을 기반으로 특정 가격 범위의 수를 할 수 있도록하고 싶습니다 partmentshouses는, freeholds, 당신은 GROUP BY property_type

SELECT property_type, COUNT(*) 
FROM $wpdb->postmeta 
WHERE meta_value BETWEEN 50000 AND 74999 
GROUP BY property_type 
를 추가해야 속성 값의 각각의 수를 표시하는보고

업데이트 : 당신은 데이터를 당신과 같이 설명하는 방식 얻기 위해 피벗에 열로 당신의 행이 다음 meta_value 필드가 모두 문자열 값을 저장하도록되어 있음을

SELECT t.property_type, COUNT(t.post_id) AS 'type count' 
FROM 
(
    SELECT t.post_id, 
    MAX(CASE WHEN t.meta_key = 'property_type' THEN t.meta_value END) AS property_type, 
    MAX(CASE WHEN t.meta_key = 'price' THEN CAST(t.meta_value AS DECIMAL) END) AS Price 
    FROM postmeta t 
    GROUP BY t.post_id 
) t 
WHERE t.property_type = 'apartment' 
    AND t.Price BETWEEN 600000 AND 700000 
GROUP BY t.property_type 

주 속성 유형뿐만 아니라 price에 대한 숫자 값이므로 CAST에서 DECIMAL으로 숫자 데이터 유형으로 선택하여 나중에 계산할 수 있습니다. 또한 MAX을 집계 함수로 사용하여 행을 피벗하는 작업을 수행했습니다.

여기에 demo in SQL fiddle입니다.

이러한 디자인 모델에서 보통 접하게되는 것은 Entity–attribute–value model입니다. 이 데이터 모델에 대한 유용한 스레드는 태그 아래에 많이 있습니다. 이 디자인 모델에 대해 더 유용한 페이지를 찾을 수도 있습니다. the following answer

+0

테이블 구조가 업데이트되었습니다. 내가 뭘 찾고 있었는지는 모르지만, 감사합니다. – Plastika

+0

@Plastika 내 편집 내역보기 –

0

이 테이블 구조는 찾고자하는 다중 영역 검색 유형을 다소 어렵게 만들거나 비효율적으로 만듭니다. WHERE 절이 모두 만족되도록하려면 meta 테이블 자체에 INNER JOIN 테이블이 필요합니다. 이렇게하면 검색어에 좀 더 적합한 임시 데이터 형식이 제공됩니다.

SELECT m1.post_id 
FROM meta m1 
INNER JOIN meta m2 ON m1.post_id = m2.post_id 
WHERE m1.meta_key = 'price' 
AND m1.meta_value 
BETWEEN 50000 AND 7000000 AND m2.meta_key = 'property_type' 
AND m2.meta_value = 'apartment' 

당신이 추가 할 때마다 추가로면을 위해, 당신은 추가 INNER JOIN을 수행해야합니다, 명심하십시오. 또한 이미 가지고 있지 않다면 post_id 열의 색인을 권하고 싶습니다.

카운트를 얻으려면 SELECT 절의 내용을 변경하십시오.

SELECT COUNT(*) 
FROM meta m1 
INNER JOIN meta m2 ON m1.post_id = m2.post_id 
WHERE m1.meta_key = 'price' 
AND m1.meta_value 
BETWEEN 50000 AND 7000000 AND m2.meta_key = 'property_type' 
AND m2.meta_value = 'apartment' 
+0

좋은 소식 - 이것은 내가 무엇을 향하고 있는지를 보여줍니다. 하지만 한 가지는 post_id 값을 반환합니다. 주어진 가격 범위 내에 게시물 (아파트)이 몇 개나 있는지 계산하려면 어떻게해야합니까? (사과 - 아직 마스터 된 SQL 쿼리가 아닙니다.) – Plastika

관련 문제