2016-09-07 50 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 –