2012-11-15 89 views
0

我正在研究一種用於存儲有關對象的無模式元數據的EAV存儲系統,現在正在研究如何讓它可搜索,但大部分數據庫服務器都完成了處理。將SQL結果行合併到一起

的EAV的表是:

`entityID` - INT(11) 
`entity` - VARCHAR(128) 
`attribute` - VARCHAR(128) 
`value` - BLOB 

這是我的發言:

SELECT 
    `entity`, 
    (CASE WHEN `attribute` = 'bob' THEN `value` ELSE NULL END) `bob`, 
    (CASE WHEN `attribute` = 'dean' THEN `value` ELSE NULL END) `dean` 
FROM `eav` 

返回一套漂亮的行(預期)是這樣的:

+----------+------+------+ 
| entity | bob | dean | 
+----------+------+------+ 
| testEnt | foo | NULL | // attribute = bob 
+----------+------+------+ 
| testEnt | NULL | NULL | // another test attribute 
+----------+------+------+ 
| testEnt | NULL | NULL | // another test attribute 
+----------+------+------+ 
| testEnt2 | foo | NULL | // attribute = bob 
+----------+------+------+ 
| testEnt2 | NULL | foo | // attribute = dean 
+----------+------+------+ 

但是當我附上GROUP BY (Entity)時,結果變成:

+----------+------+------+ 
| entity | bob | dean | 
+----------+------+------+ 
| testEnt | foo | NULL | 
+----------+------+------+ 
| testEnt2 | foo | NULL | 
+----------+------+------+ 

因此在停止工作後使用HAVING語法。有沒有一種方式,使返回的結果是:

+----------+------+------+ 
| entity | bob | dean | 
+----------+------+------+ 
| testEnt | foo | NULL | 
+----------+------+------+ 
| testEnt2 | foo | foo | 
+----------+------+------+ 

回答

2

應用聚合函數的CASEGROUP BY。由於值是字符串,你可以使用一個MAX()MIN()返回結果:

SELECT 
    `entity`, 
    Max(CASE WHEN `attribute` = 'bob' THEN `value` ELSE NULL END) `bob`, 
    Max(CASE WHEN `attribute` = 'dean' THEN `value` ELSE NULL END) `dean` 
FROM `eav` 
group by `entity` 

SQL Fiddle with Demo

在活動現場,你有數目不詳的attribute值的迴歸,你可以使用準備語句得到的結果:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when attribute = ''', 
     attribute, 
     ''' then value end) AS ', 
     attribute 
    ) 
) INTO @sql 
FROM eav; 

SET @sql = CONCAT('SELECT entity, ', @sql, ' 
        FROM eav 
        GROUP BY entity'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo

兩者的結果將爲:

| ENTITY | BOB | DEAN | 
--------------------------- 
| testEnt | foo | (null) | 
| testEnt2 | foo | foo | 
3

,唯一的問題是,你做你的GROUP記錄,但你還沒有彙總的字段。通過使用MAX彙總該字段來嘗試。

SELECT 
    `entity`, 
    MAX(CASE WHEN `attribute` = 'bob' THEN `value` ELSE NULL END) `bob`, 
    MAX(CASE WHEN `attribute` = 'dean' THEN `value` ELSE NULL END) `dean` 
FROM `eav` 
GROUP BY `entity` 
+0

並感謝您對John Woo – topherg