Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL表排序非规范化表_Sql_Sorting - Fatal编程技术网

SQL表排序非规范化表

SQL表排序非规范化表,sql,sorting,Sql,Sorting,我有两张桌子: “产品”conatains基本产品数据 product_id | product_name | product_picture 1 | test | pic.jpg 2 | samp | sam.gif product_details包含产品的详细信息(每个product_id 1个或多个) 现在我想按大小来分类。(有点像标准化的表格)结果: 编程语言是PHP。通常我会这样做(伪代码): 但我不知道如何对结果进

我有两张桌子:

“产品”conatains基本产品数据

product_id | product_name | product_picture
1          | test         | pic.jpg
2          | samp         | sam.gif
product_details包含产品的详细信息(每个product_id 1个或多个)

现在我想按大小来分类。(有点像标准化的表格)结果:

编程语言是PHP。通常我会这样做(伪代码):

但我不知道如何对结果进行排序。(我猜用PHP排序的性能不如SQL?)

编辑: 新想法:首先执行查询以按正确顺序选择产品标识:

while(SELECT products_id FROM products INNER JOIN products_details USING(products_id) WHERE unit = 'size' ORDER BY value) {
   while( SELECT value, unit FROM products_details WHERE products_id = id) {
      myarray[a.id][b.unit] = b.value;
   }
}

如果要使其规格化,则应在不同的列中具有不同类型的特性。基本上,您需要取消绑定您的属性。一种方法是使用条件聚合,如下所示:

SELECT
  p.product_id,
  p.product_name,
  p.product_picture,
  MAX(CASE d.unit WHEN 'size'   THEN d.value END) AS size,
  MAX(CASE d.unit WHEN 'weight' THEN d.value END) AS weight,
  MAX(CASE d.unit WHEN 'color'  THEN d.value END) AS color
FROM products p
LEFT JOIN product_details d
ON p.product_id = d.product_id
GROUP BY
  p.product_id,
  p.product_name,
  p.product_picture
;
product_id  product_name  product_picture  size   weight  color
----------  ------------  ---------------  -----  ------  -----
1           test          pic.jpg          100mm  100g    NULL
2           samp          sam.gif          80mm   NULL    red
这将为您提供如下数据集:

SELECT
  p.product_id,
  p.product_name,
  p.product_picture,
  MAX(CASE d.unit WHEN 'size'   THEN d.value END) AS size,
  MAX(CASE d.unit WHEN 'weight' THEN d.value END) AS weight,
  MAX(CASE d.unit WHEN 'color'  THEN d.value END) AS color
FROM products p
LEFT JOIN product_details d
ON p.product_id = d.product_id
GROUP BY
  p.product_id,
  p.product_name,
  p.product_picture
;
product_id  product_name  product_picture  size   weight  color
----------  ------------  ---------------  -----  ------  -----
1           test          pic.jpg          100mm  100g    NULL
2           samp          sam.gif          80mm   NULL    red
一旦为每个属性指定了单独的列,就可以按自己喜欢的方式对行进行排序。例如:

SELECT
  p.product_id,
  p.product_name,
  p.product_picture,
  MAX(CASE d.unit WHEN 'size'   THEN d.value END) AS size,
  MAX(CASE d.unit WHEN 'weight' THEN d.value END) AS weight,
  MAX(CASE d.unit WHEN 'color'  THEN d.value END) AS color
FROM products p
LEFT JOIN product_details d
ON p.product_id = d.product_id
GROUP BY
  p.product_id,
  p.product_name,
  p.product_picture
ORDER BY
  weight,
  color,
  size
;
选择
p、 产品标识,
p、 产品名称,
p、 产品图片,
最大值(当“尺寸”时为案例d单位,然后为d值结束)作为尺寸,
作为重量的最大值(当“重量”时为d单位,然后为d值结束),
作为颜色的最大值(当“颜色”时为d单位,然后为d值结束)
来自产品p
左连接产品详细信息
在p.product\u id=d.product\u id上
分组
p、 产品标识,
p、 产品名称,
p、 产品图片
订购人
重量,
颜色
大小
;
SELECT
  p.product_id,
  p.product_name,
  p.product_picture,
  MAX(CASE d.unit WHEN 'size'   THEN d.value END) AS size,
  MAX(CASE d.unit WHEN 'weight' THEN d.value END) AS weight,
  MAX(CASE d.unit WHEN 'color'  THEN d.value END) AS color
FROM products p
LEFT JOIN product_details d
ON p.product_id = d.product_id
GROUP BY
  p.product_id,
  p.product_name,
  p.product_picture
ORDER BY
  weight,
  color,
  size
;