2012-06-12 45 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也是其中包含「CA」將input_value列中的值排。這張桌子有超過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吧:) – 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)