比较不同供应商的一组产品 - SQL与PHP

时间:2014-01-24 10:04:39

标签: php mysql sql

我有一个表格,允许用户选择一组产品并比较不同供应商的价格

这是数据:

供应商表

Suppliers (id, name)
Values (1, 'Shop 1')
Values (2, 'Shop 2')
Values (3, 'Shop 3')
...

设备表

Devices (id, name)
Values (1, 'IBM x201')
Values (2, 'IBM x220')
Values (3, 'IBM x230')
...

产品表

Products (id, device_id, supplier_id, hdd_size, cpu, price)
Values (1, 1, 1, 160, 2.0, 300)
Values (2, 1, 1, 320, 2.0, 330)
Values (3, 1, 1, 160, 2.2, 360)
Values (4, 1, 1, 320, 2.2, 410)
Values (5, 1, 2, 160, 2.0, 310)
Values (6, 1, 2, 320, 2.0, 340)
Values (7, 1, 2, 160, 2.2, 370)
Values (8, 1, 2, 320, 2.2, 420)
...

因此,用户可能会要求q或更多设备提供不同的crytria价格:

请求:

[ 
   { device_id: 1, hdd: 160 },
   { device_id: 3, cpu: 2.0}
]

因此,用户希望购买硬件至少为160GB的IBM x201和价格至少为2.0GHZ的IBM x230。 这应该返回按supplier_id分组的价格,例如

{ supplier_id: 1, price: 730, products: [
    { id: 1, hdd_size: 160, cpu: 2.0, price: 300 },
    { id: 22, hdd_size: 160, cpu: 2.2, price: 430 },
]},
{ supplier_id: 1, price: 780, products: [
    { id: 1, hdd_size: 160, cpu: 2.0, price: 300 },
    { id: 37, hdd_size: 320, cpu: 2.2, price: 480 },
]},
{ supplier_id: 2, price: 750, products: [
    { id: 12, hdd_size: 160, cpu: 2.0, price: 310 },
    { id: 39, hdd_size: 160, cpu: 2.0, price: 440 },
]},
...

如何在SQL中执行此操作。我正在尝试不同的方法,但我已经达到了这样的程度,我认为在DB之外进行分组和计算实际上可能更容易。

有什么想法吗?

编辑: http://sqlfiddle.com/#!2/162b62

2 个答案:

答案 0 :(得分:1)

假设您需要满足每个供应商条件的2个最低价值的产品,以下是解决方案

选择supplier_id,sum(price)为sum,array [     array [(从products_id = P.supplier_id按价格asc limit 1的产品中选择id),     (从products_id = P.supplier_id的产品中选择hdd_size,按价格asc limit 1),     (从products_id = P.supplier_id的产品中选择cpu,按价格asc limit 1),     (从供应商_id = P.supplier_id按价格asc限制1)的产品中选择价格,),     array [(从products_id = P.supplier_id按价格asc offset 1 limit 1的产品中选择id),     (从products_id = P.supplier_id的产品中选择hdd_size,按价格asc offset 1 limit 1),     (从products_id = P.supplier_id的产品中选择cpu,按价格asc offset 1 limit 1),     (从products_id = P.supplier_id的产品中选择价格asc offset 1 limit 1)]     ] 来自P的产品,其中device_id =(从名称为ilike'ibm x201'的设备中选择id)和cpu> = 2.0且hdd_size> = 160  按供应商_id分组,具有计数(id)> 2;

您可以通过在您打算使用它的语言中的for循环中创建sql语句来轻松修改此项以获取多个产品计数。这是冗长的,我真的不知道性能,但它做到了。

它确实比单独计算所有供应商的计数(对2个供应商进行测试)。我不确定当元组数增加时它会如何发展。

答案 1 :(得分:0)

尝试

SELECT 
name, device_id, supplier_id, hdd, cpu, price
FROM 
products p JOIN
devices d ON p.device_id = d.id
WHERE 
(name = 'ibm x201' AND hdd >= 160)
OR
(name = 'ibm x230' AND cpu >= 2.0)

SQLFIDDLE