0

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

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

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

  • ID
  • entity_id
  • ...

参数(所有实体属性颜色、名称、品牌等)

  • ID
  • 姓名
  • …</li>

(一个条目和参数的单个值)

  • ID
  • entry_id(entry.id 的外键)
  • parameter_id(parameter.id 的外键)
  • 价值(实际价值)

这些表代表存储在 MySQL 数据库中的动态表。

该方案的唯一问题是对 2 个(或更多)参数进行排序。例如,按制造年份 DESC 和品牌 ASC 对所有汽车进行排序。

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

对于这些对象:

实体

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。

4

2 回答 2

3

您可以根据要排序的参数多次连接参数表,使用参数 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
于 2013-08-23T11:10:54.033 回答
2

So, to recap, you have table something like this...

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');

...from which you can obtain a result something like this...

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 |
+--------+--------------+------+

...so what was the problem again?

(and pray pity the poor data types)

于 2013-08-23T10:24:04.657 回答