我有表documents
表keywords
。每个文档都可以包含任意数量的关键字。
关键字示例:
Client Name
,
Billing period
,
Client Address
等等。
必须注意的是,文档上可以包含任何关键字,因此无法对其进行规范化(仅仅是元数据)。
现在我想订购,例如Client Name
然后Billing Period
,我该怎么做?
如果我Select * from Keywords group by keyword order by value
我不能得到我需要的东西。我没有太多的MySQL经验,所以我做不了多少。
测试数据示例:
+-------+-------------+----------------------+----------------------+
| id | document_id | keyword | value |
+-------+-------------+----------------------+----------------------+
| 265 | 89 | Nº de Operacion | 000534556315 |
| 15708 | 5234 | Direccion IP | 192.168.100.168 |
| 267 | 89 | Fecha | 20131021 |
| 15760 | 5240 | Nombre de Cliente | CLIENTEN1 |
| 15761 | 5240 | Asunto | DEMANDACESTADO1220 |
| 15703 | 5234 | | DEMANDACESTADO1220 |
| 15700 | 5234 | Nombre de Legajo | Documento |
| 15702 | 5234 | Nombre del Documento | Documento |
| 15701 | 5234 | Tipo de Documento | Documento |
| 15842 | 5256 | Descripcion | ffff |
| 15709 | 5234 | Localizacion | No definida |
| 15707 | 5234 | Grupo Usuario | Operadores |
| 266 | 89 | Socio | Socio1 |
| 15835 | 5255 | Decripcion | sadsdf |
| 15704 | 5234 | ID de Usuario | ssadmin |
| 15706 | 5234 | Nombre de Usuario | ssadmin |
+-------+-------------+----------------------+----------------------+
表
mysql> describe documents;
+---------+-----------+------+-----+---------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------+------+-----+---------------------+-----------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(100) | YES | | NULL | |
| wfid | char(50) | YES | | NULL | |
| docid | char(50) | YES | | NULL | |
| created | timestamp | NO | | 0000-00-00 00:00:00 | |
| updated | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+---------+-----------+------+-----+---------------------+-----------------------------+
6 rows in set (0.00 sec)
mysql> describe keywords;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| document_id | int(11) | NO | MUL | NULL | |
| keyword | char(50) | NO | | NULL | |
| value | varchar(250) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
答案 0 :(得分:1)
您的“关键字”不是关键字。它们是属性 - 值对。这种数据存储方式称为“实体 - 属性 - 值”(缩写为EAV)。我不建议将它用于每个文档上的属性。
无论如何,这就是你拥有的。您可以使用条件聚合聚合来执行您想要的操作:
select document_id,
max(case when keyword = 'Client Name' then value end) as ClientName,
max(case when keyword = 'Billing Period' then value end) as BillingPeriod
from keywords
group by document_id
order by ClientName, BillingPeriod;
答案 1 :(得分:0)
目前尚不清楚每个文档是否可能包含多个客户名称和/或多个结算周期。如果你这样做,那么以下将实现你想要的。但是,正如其他人所说,这是将结构化信息存储在数据库中的一种非常糟糕的方式。
select d.id, cn.ClientName, bp.BillingPeriod from documents d
left join (select document_id, value as ClientName from keywords where keyword = 'Client Name') cn on d.id = cn.document_id
left join (select document_id, value as BillingPeriod from keywords where keyword = 'Billing Period') bp on d.id = bp.document_id
group by name, cn.ClientName, bp.BillingPeriod, d.id
order by cn.ClientName, bp.BillingPeriod