2016-09-07 51 views
-2

TableX Data高效的SQL語句

在從場獲得任意關聯數組對product_option_id:product_option_value_id像{ 「230」: 「23」, 「228」: 「19」},我得的最低數量來自上述TableX中的相應行。

目前,我通過基於每對PHP查詢數據庫,並存儲它們的數量。即 - 如果有3對,我根據每對數據庫查詢數據庫3次以獲得3個數量。然後我遍歷數量得到至少一個。

如果隨機{product_option_id:product_option_value_id}對是{ 「230」: 「23」, 「228」: 「19」},你可以使得到的最低數量高效的SQL語句。

我已經試過

SELECT quantity FROM TableX 
WHERE product_option_id=variable_product_option_id 
    AND product_option_value_id=variable_product_option_value_id 

我在PHP for循環所有對值運行此。我存儲的質量,並通過PHP獲得至少一個通過PHP

+0

[標準化您的數據(http://stackoverflow.com/a/32620163) – Drew

+0

以下代碼基於我的個人情況:'SELECT quantity FROM「。DB_PREFIX。」product_option_value WHERE product_option_id =「。$ key」。 AND product_option_value_id =「。$ value」。 AND subtract = 1「'我在PHP for循環中對所有的值對運行這個函數,我存儲了量化值,並且通過PHP獲得了最少的一個值 – user3980196

+0

將來,使用編輯鏈接來包含關於你的問題的額外信息。沒有人可以在評論中閱讀代碼 – RiggsFolly

回答

1

你可以試試這樣一個查詢:

select product_option_id, product_option_value_id, min(quantity) 
    from product_option_value 
    where (product_option_id = 230 and product_option_value_id = 43) 
     or (product_option_id = 228 and product_option_value_id = 49) 
    group by product_option_id, product_option_value_id; 

在實踐中:

> create table product_option_value(product_option_id int, product_option_value_id int, quantity int); 

> insert into product_option_value values 
>  (230, 43, 2), 
>  (230, 32, 1), 
>  (228, 49, 1), 
>  (228, 50, 0), 
>  (229, 50, 1), 
>  (229, 49, 1), 
>  (230, 43, 8), 
>  (230, 32, 9), 
>  (228, 49, 11), 
>  (228, 50, 10), 
>  (229, 50, 5), 
>  (229, 49, 4); 

> select product_option_id, product_option_value_id, min(quantity) 
>  from product_option_value 
>  where (product_option_id = 230 and product_option_value_id = 43) 
>   or (product_option_id = 228 and product_option_value_id = 49) 
>  group by product_option_id, product_option_value_id; 
+-------------------+-------------------------+---------------+ 
| product_option_id | product_option_value_id | min(quantity) | 
+-------------------+-------------------------+---------------+ 
| 228    | 49      | 1    | 
| 230    | 43      | 2    | 
+-------------------+-------------------------+---------------+ 

你也應該適當地引用查詢參數。使用像...product_option_id=".$key."...這樣的結構(摘自你評論中的例子)很容易出錯,因爲$key可能包含任何東西,如Little Boby Tables

編輯:爲了得到所有這些羣體的最低限度,你剛落,由小組和分組列,就像這樣:

> select min(quantity) 
>  from product_option_value 
>  where (product_option_id = 230 and product_option_value_id = 43) 
>   or (product_option_id = 228 and product_option_value_id = 49); 
+---------------+ 
| min(quantity) | 
+---------------+ 
| 1    | 
+---------------+ 
+0

感謝IZO等。雖然你的解決方案並不是我正在尋找的,但我現在知道如何處理這個問題。在你的優秀例子中,結果是數量爲1和2的2行。我只想得到最小數量的單行,即 - 1。 – user3980196

+0

啊,我明白了。在那種情況下,它更容易。我更新了我的答案以覆蓋此用例。 – Zoltan

0

我認爲你應該嘗試下面的一個查詢來獲得你的結果。

爲了得到這樣的結果product_option_id:product_option_value_id你應該使用MYSQL的CONCAT函數。

SELECT CONCAT(product_option_id,':',product_option_value_id) 
FROM TABLE 
WHERE subtract = 1 
GROUP BY product_option_id 
ORDER BY product_option_value_id ASC 

此外,你可以把額外的條件。

請試試這個。

+0

感謝您編輯@RiggsFolly –