高效的SQL语句

时间:2016-09-07 13:55:52

标签: mysql sql

TableX Data

从字段 product_option_id获取随机关联数组对:product_option_value_id ,例如{" 230":" 23"," 228": " 19"},我必须从上面的TableX中的相应行中获得最小数量

目前,我基于每一对通过PHP查询数据库,并存储它们的数量。 ie-如果有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循环中运行它。我存储了quanity,并通过PHP获得至少一个

2 个答案:

答案 0 :(得分: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             |
+---------------+

答案 1 :(得分: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

此外,您可以在条件允许的情况下添加。

请试一试。