0
想象一下兩個簡單的數據透視表a
和v
具有以下結構和數據:如何在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 |
+----+------------+-----------+
怎能此相同的搜索可以在樞軸表中執行,而不使用圖(只是使用表a
和v
)?
我已經在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 |
+----+------------+---------------+
感謝