我们正在使用entity-attribute-value模式在项目中存储对象。它基本上是这样的:
实体 - 虚拟存储所有条目原型(汽车,房屋等)
条目(单个实体对象的表示)
参数(所有实体属性颜色,名称,品牌等)
值(一个条目和参数的单个值)
这些表表示存储在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。
答案 0 :(得分: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 |
+--------+--------------+------+
......那又是什么问题?
(并祈惜可怜的数据类型)
答案 1 :(得分:2)
您可以将参数表连接参数表连接多次,参数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