2012-06-12 3 views
1

은 내가 다음 표는 열과 값 [클라이언트]라는 이름의 한 MySQL의 자체 참조 :다음과 같이 쿼리

+--------+-----------+--------------+----------------+ 
| uid | client_id | client_input | input_value | 
+--------+-----------+--------------+----------------+ 
| 1  | 22  | City  | Seattle  | 
+--------+-----------+--------------+----------------+ 
| 2  | 45  | City  | Ojai   | 
+--------+-----------+--------------+----------------+ 
| 3  | 22  | State  | OR   | 
+--------+-----------+--------------+----------------+ 
| 4  | 45  | State  | CA   | 
+--------+-----------+--------------+----------------+ 
| 5  | 65  | City  | Orlando  | 
+--------+-----------+--------------+----------------+ 
| 6  | 74  | State  | AB   | 
+--------+-----------+--------------+----------------+ 
| 7  | 65  | State  | FL   | 
+--------+-----------+--------------+----------------+ 
| 8  | 12  | City  | Los Angeles | 
+--------+-----------+--------------+----------------+ 
| 9  | 12  | State  | CA   | 

나는 PHP/MySQL은 쿼리이 필요한 것 목록 모든 개 도시에서 존재 input_value 열은 'CA'상태에 있습니다. 분명히 공통 식별자는 클라이언트가 에있는 경우 때문에 항상 일치되는 CLIENT_ID이다 '로스 앤젤레스' 같은 CLIENT_ID은 input_value 열에서 'CA'의 값이 포함 된 행에도. 이 테이블에는 800 만 개가 넘는 행이 있으며 빠른 수행 속도를 자랑하는 equerry는 높이 평가합니다.

뇌가 튀어 나와 기한이 다가오고 있으며 테이블 디자인을 변경할 수 없으므로 도움이 필요합니다.

+1

바이올린 : http://sqlfiddle.com/ #! 2/7ed3f. 테이블에 대한 create table 명령문을 보여줄 수 있습니까? – biziclop

+2

그래서 각 클라이언트에 대해 캘리포니아의 모든 도시를 원하십니까? 나는 그것을 얻지 않는다. – Sebas

답변

1
SELECT * 
FROM table AS t1 INNER JOIN table AS t2 ON t1.client_id = t2.client_id 
WHERE t1.client_input = 'City' AND t2.client_input = 'State' AND t2.input_value = 'CA' 

참고 :이 일부 조정해야 할 수도 있습니다 가능성을 최적화 할 수 있습니다. 그러나 그것은 당신이 당신의 두뇌를 시작하고 식히도록해야합니다.

+1

@Esailija 편집 해 주셔서 감사합니다. –

+0

초고속 응답에 감사드립니다. 예,이 작업이 가능합니다. 그러나 도시 만 반환하지는 않습니다. SELECT * FROM 문은 쿼리와 일치하는 값의 전체 행 (배열)을 반환한다고 말합니다. 하지만 약간의 PHP 배열 마법으로 내가 필요한 것을 얻고 있습니다. – Milan

+0

쿼리를 다음과 같이 간단히 업데이트하면됩니다 :'SELECT t1.input_value ... ' –

0

이 쿼리는 테스트하지 않았습니다. 그러나이 또는 유사한 쿼리가 작동해야합니다. 먼저 불필요한 조인을 피하기 위해 두 개의 하위 쿼리를 사용했습니다. 상태 'CA'에 대한 첫 번째 하위 쿼리 필터와 도시에 대한 두 번째 하위 쿼리. 상태에 따라 모든 도시에 대한 테이블을 원할 경우, 부속 조회 a에서 'CA'절을 제거하십시오. 나는 두 개의 인덱스를 ... 것

SELECT b.input_value AS city, a.input_value AS state 
FROM 
    (SELECT client_id, input_value 
    FROM tablename 
    WHERE input_value = 'CA' 
    AND client_input = 'State') 
    AS a, 
    (SELECT client_id, input_value 
    FROM tablename 
    WHERE client_input = 'City') 
    AS b 
WHERE a.client_id = b.client_id 
+0

쿼리를 작동 시키면 좋겠습니다. 조인이 비싸고 지체 시간이 거의 2s 인 것 같기 때문에 나는 너를 게시 할 것이다. huh :) – Milan

0
SELECT distinct 
     t2.Input_Value as City 
    from 
     YourTable t1 
     JOIN YourTable t2 
      on t1.client_ID = t2.Client_ID 
      AND t2.client_input = 'City' 
    where 
      t1.client_input = 'State' 
     AND t1.Input_Value = 'CA' 

(Client_Input, Input_Value) 및 (CLIENT_ID, Client_Input, Input_Value)

위의 표와