2015-11-13 29 views
0

想象一下兩個簡單的數據透視表av具有以下結構和數據:如何在MySQL的數據透視表搜索,而無需使用瀏覽

CREATE TABLE IF NOT EXISTS `a` (
    `i` bigint(13) NOT NULL AUTO_INCREMENT, 
    `a` bigint(13) NOT NULL, 
    PRIMARY KEY (`i`), 
    KEY `a` (`a`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
COMMENT='records' AUTO_INCREMENT=6 ; 

INSERT INTO `a` (`i`, `a`) VALUES 
(1, 0), 
(2, 1), 
(3, 2), 
(4, 2), 
(5, 2); 

CREATE TABLE IF NOT EXISTS `v` (
    `i` bigint(13) NOT NULL, 
    `k` bigint(13) NOT NULL, 
    `v` varchar(1024) COLLATE utf8_unicode_ci DEFAULT NULL, 
    UNIQUE KEY `ixk` (`i`,`k`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
COMMENT='varchar (1024) fields'; 

INSERT INTO `v` (`i`, `k`, `v`) VALUES 
(1, 1, 'Organizations'), 
(3, 1, 'Apple Inc.'), 
(3, 2, 'apple.com'), 
(4, 1, 'Microsoft Corporation'), 
(4, 2, 'microsoft.com'), 
(5, 1, 'Google Corporation'), 
(5, 2, 'google.com'); 

人們可以從這些表中提取的信息,兩個「虛擬」表如下使用透視表選擇語句:

select a.i as 'id', 
ifnull (max(case when v.k = 1 then v.v end),'') 'Table' 
from a 
left join v on a.i = v.i 
where a.a = 0 
group by a.i 

產生下列:

+----+---------------+ 
| id | Table   | 
+----+---------------+ 
| 1 | Organizations | 
+----+---------------+ 

select a.i as 'id', 
ifnull (max(case when v.k = 1 then v.v end),'') 'Company', 
ifnull (max(case when v.k = 2 then v.v end),'') 'Domain' 
from a 
left join v on a.i = v.i 
where a.a = 2 group by a.i 

產生:

+----+-----------------------+---------------+ 
| id | Company    | Domain  | 
+----+-----------------------+---------------+ 
| 3 | Apple Inc.   | apple.com  | 
| 4 | Microsoft Corporation | microsoft.com | 
| 5 | Google Corporation | google.com | 
+----+-----------------------+---------------+ 

人們可以再創建一個視圖說上查詢:

CREATE ALGORITHM = UNDEFINED VIEW `organizations` 
AS SELECT a.i AS 'id', 
IFNULL(MAX(CASE WHEN v.k =1 THEN v.v END) , '') 'Company', 
IFNULL(MAX(CASE WHEN v.k =2 THEN v.v END) , '') 'Domain' 
FROM a 
LEFT JOIN v ON a.i = v.i 
WHERE a.a =2 
GROUP BY a.i 

,然後執行類似搜索:

SELECT * 
FROM `organizations` 
WHERE `Company` LIKE '%Apple%' 

提取數據:

+----+------------+-----------+ 
| id | Company | Domain | 
+----+------------+-----------+ 
| 3 | Apple Inc. | apple.com | 
+----+------------+-----------+ 

怎能此相同的搜索可以在樞軸表中執行,而不使用圖(只是使用表av)?

我已經在where子句中嘗試了case語句:

select a.i as 'id', 
ifnull (max(case when v.k = 1 then v.v end),'') 'Company', 
ifnull (max(case when v.k = 2 then v.v end),'') 'Domain' 
from a 
left join v on a.i = v.i 
where a.a = 2 
AND CASE WHEN v.k = 1 THEN v.v LIKE '%Apple%' ELSE TRUE END 
group by a.i 

但它並不孤立/提取虛擬行,它會顯示所有的行,但僅匹配數據:

+----+------------+---------------+ 
| id | Company | Domain  | 
+----+------------+---------------+ 
| 3 | Apple Inc. | apple.com  | 
| 4 |   | microsoft.com | 
| 5 |   | google.com | 
+----+------------+---------------+ 

感謝

回答

1

使用子查詢:

SELECT * 
FROM (
    select a.i as 'id', 
    ifnull (max(case when v.k = 1 then v.v end),'') 'Company', 
    ifnull (max(case when v.k = 2 then v.v end),'') 'Domain' 
    from a 
    left join v on a.i = v.i 
    WHERE a.a =2 
    group by a.i 
) AS sub 
WHERE `Company` LIKE '%Apple%' 

SqlFiddleDemo

輸出:

╔═════╦═════════════╦═══════════╗ 
║ id ║ Company ║ Domain ║ 
╠═════╬═════════════╬═══════════╣ 
║ 3 ║ Apple Inc. ║ apple.com ║ 
╚═════╩═════════════╩═══════════╝