Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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
Mysql 在实体属性值模式中对两列进行排序_Mysql_Sorting_Entity Attribute Value - Fatal编程技术网

Mysql 在实体属性值模式中对两列进行排序

Mysql 在实体属性值模式中对两列进行排序,mysql,sorting,entity-attribute-value,Mysql,Sorting,Entity Attribute Value,我们正在使用实体属性值模式来存储项目中的对象。基本上是这样的: 实体-所有条目原型(汽车、房屋等)的虚拟存储 条目(表示单个实体对象) 身份证 实体id 参数(所有实体属性颜色、名称、品牌等) 身份证 名字 值(一个条目和参数的单个值) 身份证 entry\u id(entry.id的外键) parameter\u id(parameter.id的外键) 价值(实际价值) 这些表表示存储在MySQL数据库中的动态表 此方案的唯一问题是排序超过2个(或更多)参数。例如,按照制造年份

我们正在使用实体属性值模式来存储项目中的对象。基本上是这样的:

实体-所有条目原型(汽车、房屋等)的虚拟存储

条目(表示单个实体对象)

  • 身份证
  • 实体id
参数(所有实体属性颜色、名称、品牌等)

  • 身份证
  • 名字
(一个条目和参数的单个值)

  • 身份证
  • entry\u id(entry.id的外键)
  • parameter\u id(parameter.id的外键)
  • 价值(实际价值)
这些表表示存储在MySQL数据库中的动态表

此方案的唯一问题是排序超过2个(或更多)参数。例如,按照制造年份描述和品牌ASC对所有汽车进行分类

我们需要的最终结果是条目ID的排序列表

对于这些对象:

实体

id | name
------------------------------
1  | Car
------------------------------
id| entity_id
-------------
1 | 1
-------------
2 | 1
-------------
3 | 1
-------------
条目

id | name
------------------------------
1  | Car
------------------------------
id| entity_id
-------------
1 | 1
-------------
2 | 1
-------------
3 | 1
-------------
参数

id| entity_id | name
-----------------------
1 | 1         | Brand
-----------------------
2 | 1         | Year 
-----------------------

id | entry_id | parameter_id | value 
----------------------------------------------
1  | 1        | 1            | Tatra
----------------------------------------------
2  | 1        | 2            | 2005
----------------------------------------------
3  | 2        | 1            | Aston Martin
----------------------------------------------
4  | 2        | 2            | 1999
----------------------------------------------
5  | 3        | 1            | Man
----------------------------------------------
6  | 3        | 2            | 2005
----------------------------------------------

根据给定的标准,这些条目的正确顺序应该是3、1、2。

因此,概括一下,您有这样的表格

DROP TABLE IF EXISTS eav_hell;

CREATE TABLE eav_hell
(entity INT NOT NULL
,attribute VARCHAR(12) NOT NULL
,value VARCHAR(12)
);

INSERT INTO eav_hell VALUES
(1,'Brand','Tatra'),
(1,'Year','2005'),
(2,'Brand','Aston Martin'),
(2,'Year','1999'),
(3,'Brand','Man'),
(3,'Year','2005');
SELECT entity
     , MAX(CASE WHEN attribute = 'Brand' THEN value END) Brand
     , MAX(CASE WHEN attribute = 'Year' THEN value END) Year
  FROM eav_hell
 GROUP
    BY entity;   

+--------+--------------+------+
| entity | Brand        | Year |
+--------+--------------+------+
|      1 | Tatra        | 2005 |
|      2 | Aston Martin | 1999 |
|      3 | Man          | 2005 |
+--------+--------------+------+
…从中你可以得到这样的结果

DROP TABLE IF EXISTS eav_hell;

CREATE TABLE eav_hell
(entity INT NOT NULL
,attribute VARCHAR(12) NOT NULL
,value VARCHAR(12)
);

INSERT INTO eav_hell VALUES
(1,'Brand','Tatra'),
(1,'Year','2005'),
(2,'Brand','Aston Martin'),
(2,'Year','1999'),
(3,'Brand','Man'),
(3,'Year','2005');
SELECT entity
     , MAX(CASE WHEN attribute = 'Brand' THEN value END) Brand
     , MAX(CASE WHEN attribute = 'Year' THEN value END) Year
  FROM eav_hell
 GROUP
    BY entity;   

+--------+--------------+------+
| entity | Brand        | Year |
+--------+--------------+------+
|      1 | Tatra        | 2005 |
|      2 | Aston Martin | 1999 |
|      3 | Man          | 2005 |
+--------+--------------+------+
…那又是什么问题


(可怜可怜可怜可怜可怜的数据类型)

所以,概括一下,您有这样的表

DROP TABLE IF EXISTS eav_hell;

CREATE TABLE eav_hell
(entity INT NOT NULL
,attribute VARCHAR(12) NOT NULL
,value VARCHAR(12)
);

INSERT INTO eav_hell VALUES
(1,'Brand','Tatra'),
(1,'Year','2005'),
(2,'Brand','Aston Martin'),
(2,'Year','1999'),
(3,'Brand','Man'),
(3,'Year','2005');
SELECT entity
     , MAX(CASE WHEN attribute = 'Brand' THEN value END) Brand
     , MAX(CASE WHEN attribute = 'Year' THEN value END) Year
  FROM eav_hell
 GROUP
    BY entity;   

+--------+--------------+------+
| entity | Brand        | Year |
+--------+--------------+------+
|      1 | Tatra        | 2005 |
|      2 | Aston Martin | 1999 |
|      3 | Man          | 2005 |
+--------+--------------+------+
…从中你可以得到这样的结果

DROP TABLE IF EXISTS eav_hell;

CREATE TABLE eav_hell
(entity INT NOT NULL
,attribute VARCHAR(12) NOT NULL
,value VARCHAR(12)
);

INSERT INTO eav_hell VALUES
(1,'Brand','Tatra'),
(1,'Year','2005'),
(2,'Brand','Aston Martin'),
(2,'Year','1999'),
(3,'Brand','Man'),
(3,'Year','2005');
SELECT entity
     , MAX(CASE WHEN attribute = 'Brand' THEN value END) Brand
     , MAX(CASE WHEN attribute = 'Year' THEN value END) Year
  FROM eav_hell
 GROUP
    BY entity;   

+--------+--------------+------+
| entity | Brand        | Year |
+--------+--------------+------+
|      1 | Tatra        | 2005 |
|      2 | Aston Martin | 1999 |
|      3 | Man          | 2005 |
+--------+--------------+------+
…那又是什么问题


(还有糟糕的数据类型)

只要有参数要排序,就可以多次连接参数表,参数id作为连接条件,这样就可以得到一个简单的行集,值作为列进行排序

SELECT entry.id as entry_id, 
       v_brand.value as brand,
       v_year.value as year 
FROM entity
  JOIN entry 
    ON entity.id = entry.entity_id
  JOIN value v_brand 
    ON v_brand.parameter_id = 1 
    AND v_brand.entry_id = entry.id
  JOIN value v_year 
    ON v_year.parameter_id = 2 
    AND v_year.entry_id = entry.id
WHERE entity.name = 'Car'
ORDER BY year DESC, brand ASC

只要有要排序的参数,就可以将参数表连接多次,并将参数id作为连接条件,这样就可以得到一个简单的行集,其中的值作为列进行排序

SELECT entry.id as entry_id, 
       v_brand.value as brand,
       v_year.value as year 
FROM entity
  JOIN entry 
    ON entity.id = entry.entity_id
  JOIN value v_brand 
    ON v_brand.parameter_id = 1 
    AND v_brand.entry_id = entry.id
  JOIN value v_year 
    ON v_year.parameter_id = 2 
    AND v_year.entry_id = entry.id
WHERE entity.name = 'Car'
ORDER BY year DESC, brand ASC

你试过
。。。按年份说明订购,品牌asc
?@fancyPants这比按条款订购要复杂得多。年份和品牌实际上并不是表中的列,但它们存储在参数表中。您的查询(经过一些调整使其工作)只生成一行。调整样本数据。更重要的是,不要让那些试图帮助你的人变得更加困难。这太糟糕了,你知道吗?你试过
。。。按年份说明订购,品牌asc
?@fancyPants这比按条款订购要复杂得多。年份和品牌实际上并不是表中的列,但它们存储在参数表中。您的查询(经过一些调整使其工作)只生成一行。调整样本数据。更重要的是,不要让那些试图帮助你的人变得更加困难。这太糟糕了,你知道吗?别担心,我们为不同的值类型划分了列。这正是我想要的。谢谢。别担心,我们为不同的值类型提供了单独的列。这正是我想要的。谢谢。您的解决方案比上一个更快。在我们的数据(约700k行值)上,速度非常快。谢谢!您的解决方案比上一个更快。在我们的数据(约700k行值)上,速度非常快。谢谢!