2013-07-27 71 views
1

我有一個表「model_values」,看起來像這樣:如何執行受相同表中值限制的mysql查詢?

+----+------------+-------------+----------------+------------+ 
| id | value_post | value_model | value_property | value_data | 
+----+------------+-------------+----------------+------------+ 
| 1 |   1 |   39 |    1 | ValueA  | 
| 2 |   1 |   39 |    2 | Value1  | 
| 3 |   1 |   39 |    3 | 2013  | 
| 4 |   2 |   39 |    1 | ValueA  | 
| 5 |   2 |   39 |    2 | Value2  | 
| 6 |   2 |   39 |    3 | 2012  | 
| 7 |   3 |   39 |    1 | ValueB  | 
| 8 |   3 |   39 |    2 | Value1  | 
| 9 |   3 |   39 |    3 | 2013  | 
| 10 |   4 |   30 |    1 | ValueA  | 
| 11 |   4 |   30 |    2 | Value2  | 
| 12 |   4 |   30 |    3 | 2013  | 
+----+------------+-------------+----------------+------------+ 

我試圖創建一組下拉菜單,顯示爲value_property的1和2的value_data的基礎上,下面的查詢:

SELECT * 
FROM model_values 
INNER JOIN models 
ON model_values.value_model = models.id 
INNER JOIN properties 
ON model_values.value_property = properties.id 
WHERE model_values.value_property = {$safe_property} && models.id = {$safe_model_id} 
GROUP BY model_values.value_data 

但我想下拉也受限於value_property 3(這是年份)。因此,用戶會首先選擇2013年,然後獲得兩個下拉菜單,從以下選項中進行選擇:

Select 1: ValueA/ValueB 
Select 2: Value1 

或者,如果他們選擇了2012年一,他們會看到:

Select 1: ValueA 
Select 2: Value2 

我試着拿出像查詢:

WHERE model_values.value_property = 1 && models.id = 39 && model_values.value_data = 2013 

但顯然不行,因爲value_property 1將永遠不會有2013年

value_data

或子查詢,如:

WHERE model_values.value_property = 1 && models.id = 39 && model_values.value_data = (
    SELECT model_values.value_data 
    FROM model_values 
    WHERE model_values.value_data = 2013 
) 

但返回超過1行。

是否有這樣的查詢可能?

+0

期望的結果是什麼樣的? - 併爲上述提供一個sqlfiddle – Strawberry

+0

下面是鏈接到一個sqlfiddle:http://sqlfiddle.com/#!2/d3f3b6/2 結果將看起來像鏈接中的一個,但查詢將涉及限制它到2012年,所以「價值1」不應該出現。 我只知道關於mysql在這一點上遇到麻煩。我假設,如果我不能讓這個查詢工作,我將不得不回去看看我如何通過結果在我的PHP循環。 – ryansommers

+0

我收集的是隻有mysql才能實現的功能。我已經調整了我的PHP循環,以獲得我期待的結果。不知道現在是否關閉或刪除此問題? – ryansommers

回答

0

下面的查詢返回的中間結果,這引出了兩個問題:

1我們如何知道哪些結果屬於哪一年?

2假設我們想要value_data = 2,挑選id 5而不是id 8的標準是什麼?

SELECT * 
    FROM model_values 
    WHERE value_property = 2 
    AND value_model = 39; 

ID VALUE_POST VALUE_MODEL VALUE_PROPERTY VALUE_DATA 
2 1   39   2    Value1  
5 2   39   2    Value2 
8 3   39   2    Value2 
+0

不幸的是,結果需要基於value_model(而不是value_post)並按年份過濾。它應該看起來像http://sqlfiddle.com/#!2/d3f3b6/2,只是使用某種限制它到一年的附加過濾器。 – ryansommers

0

你的最後一次嘗試幾乎是正確的只是你有子查詢返回多於1行

替換此

 && model_values.value_data = (

通過

&& model_values.value_data IN (

,我不能看其右,因爲你沒有提供模型表

+0

我調整了,所以它不應該需要模型表:http://sqlfiddle.com/#!2/d3f3b6/26雖然這爲我返回0。 – ryansommers

+0

這是你的簡單查詢,我不知道你爲什麼選擇value_data = 2012,然後你通過value_data進行分組,只是2012。看這個http://sqlfiddle.com/#!2/d3f3b6/42,我想說沒有與這些條件相匹配的字段。所以當然它是空的 –