2013-10-22 60 views
1

我非常感謝一些幫助開發一個連接4個表的查詢結構,但也包括多個CASE語句。MySQL加入4個表CASE

我正在嘗試生成一個SELECT語句,可以用於客戶端網站上的快速查看報告,該網站正從成員目錄中提取,並根據輸入的值顯示自定義配置文件字段的值。

這是我的數據庫結構(消毒的提取物)。

-- 
-- Table structure for TABLE cats 
-- 

CREATE TABLE cats (
cat_id INT(12) NOT NULL auto_increment, 
cat_name VARCHAR(64), 
cat_parent INT(12), 
primary KEY (cat_id)); 

-- 
-- Dumping data for TABLE cats 
-- 
INSERT INTO cats VALUES(1, 'Root', 0); 
INSERT INTO cats VALUES(2, 'GroupA', 1); 
INSERT INTO cats VALUES(3, 'GroupB', 1); 
INSERT INTO cats VALUES(4, 'ClassA', 2); 
INSERT INTO cats VALUES(5, 'ClassB', 2); 
INSERT INTO cats VALUES(6, 'ClassC', 2); 
INSERT INTO cats VALUES(7, 'ClassD', 3); 
INSERT INTO cats VALUES(8, 'ClassE', 3); 
INSERT INTO cats VALUES(9, 'ClassF', 3); 

-- -------------------------------------------------------- 

-- 
-- Table structure for TABLE catlink 
-- 

CREATE TABLE catlink (
cl_id int(11) NOT NULL auto_increment, 
link_id int(11) NOT NULL default '0', 
cat_id int(11) NOT NULL default '0', 
primary KEY (cl_id)); 


-- 
-- Dumping data for TABLE catlink 
-- 

INSERT INTO catlink VALUES(1, 1, 3); 
INSERT INTO catlink VALUES(2, 2, 4); 
INSERT INTO catlink VALUES(3, 3, 5); 
INSERT INTO catlink VALUES(4, 4, 6); 
INSERT INTO catlink VALUES(5, 5, 7); 
INSERT INTO catlink VALUES(6, 6, 8); 

-- -------------------------------------------------------- 

-- 
-- Table structure for TABLE links 
-- 

CREATE TABLE links (
link_id int(11) NOT NULL auto_increment, 
link_name varchar(255) NOT NULL, 
primary KEY (link_id)); 

-- 
-- Dumping data for TABLE links 
-- 


INSERT INTO links VALUES(1, 'Link One'); 
INSERT INTO links VALUES(2, 'Link Two'); 
INSERT INTO links VALUES(3, 'Link Three'); 
INSERT INTO links VALUES(4, 'Link Four'); 
INSERT INTO links VALUES(5, 'Link Five'); 
INSERT INTO links VALUES(6, 'Link Six'); 

-- ------------------------------------------------------- 

-- 
-- Table structure for TABLE cfvalues 
-- 

CREATE TABLE cfvalues (
id int(11) NOT NULL auto_increment, 
cf_id int(11) NOT NULL, 
link_id int(11) NOT NULL, 
value mediumtext NOT NULL, 
primary KEY (id)); 
-- 
-- Dumping data for TABLE cfvalues 
-- 

INSERT INTO cfvalues VALUES(1, 54, 1, 'Link One name'); 
INSERT INTO cfvalues VALUES(2, 54, 2, 'Link Two name'); 
INSERT INTO cfvalues VALUES(3, 54, 3, 'Link Three name'); 
INSERT INTO cfvalues VALUES(4, 54, 4, 'Link Four name'); 
INSERT INTO cfvalues VALUES(5, 54, 5, 'Link Five name'); 
INSERT INTO cfvalues VALUES(6, 54, 6, 'Link Six name'); 
INSERT INTO cfvalues VALUES(7, 54, 7, 'Link Seven name'); 
INSERT INTO cfvalues VALUES(8, 54, 8, 'Link Eight name'); 
INSERT INTO cfvalues VALUES(9, 55, 1, 'Link One custom value'); 
INSERT INTO cfvalues VALUES(10, 55, 2, 'Link Two custom value'); 
INSERT INTO cfvalues VALUES(11, 55, 3, 'Link Three custom value'); 
INSERT INTO cfvalues VALUES(12, 55, 4, 'Link Four custom value'); 
INSERT INTO cfvalues VALUES(13, 55, 5, 'Link Five custom value'); 
INSERT INTO cfvalues VALUES(14, 55, 6, 'Link Six custom value'); 
INSERT INTO cfvalues VALUES(15, 55, 7, 'Link Seven custom value'); 
INSERT INTO cfvalues VALUES(16, 55, 8, 'Link Eight custom value'); 

這裏是我的(完全不工作)查詢。

Select cats.cat_name, links.link_name, cfvalues.value 
MAX(CASE WHEN cfvalues.cf_id =54 THEN cfvalues.value END) Name, 
MAX(CASE WHEN cfvalues.cf_id =55 THEN cfvalues.value END) Custom, 
FROM cfvalues 
INNER JOIN links ON links.link_id = cfvalues.link_id 
INNER JOIN catlink ON links.link_id = catlink.link_id 
INNER JOIN cats ON cats.cat_id = catlink.cat_id 
GROUP BY cfvalues.link_id; 

這就是我得到:

| CAT_NAME | LINK_NAME |   VALUE | 
|----------|------------|-----------------| 
| ClassA | Link One | Link One name | 
| ClassB | Link Two | Link Two name | 
| ClassC | Link Three | Link Three name | 
| ClassD | Link Four | Link Four name | 
| ClassE | Link Five | Link Five name | 
| ClassF | Link Six | Link Six name | 

這就是我要爲:

| CAT_NAME | LINK_NAME |   NAME |     CUSTOM | 
|----------|------------|-----------------|-------------------------| 
| ClassA | Link One | Link One name | Link One custom value | 
| ClassB | Link Two | Link Two name | Link Two custom value | 
| ClassC | Link Three | Link Three name | Link Three custom value | 
| ClassD | Link Four | Link Four name | Link Four custom value | 
| ClassE | Link Five | Link Five name | Link Five custom value | 
| ClassF | Link Six | Link Six name | Link Six custom value | 

請注意,列名也將需要在查詢中進行更新,以便可以使用唯一列標題而不是值va將結果導出到CSV價值等

有什麼建議嗎?我並不聲稱自己是開發人員,所以我非常感謝我能夠獲得的任何幫助! 感謝您使用子查詢:)

回答

0

一個可能的解決方案:使用if語句

select 
    c.cat_name, 
    l.link_name, 
    (select value from cfvalues cfv where cfv.link_id=l.link_id and cfv.cf_id=54) as name, 
    (select value from cfvalues cfv where cfv.link_id=l.link_id and cfv.cf_id=55) as custom 
from 
    cats c 
    INNER JOIN catlink cl ON c.cat_id = cl.cat_id 
    INNER JOIN links l ON l.link_id = cl.link_id 

替代:

select 
    c.cat_name, 
    l.link_name, 
    max(if(cfv.cf_id=54, cfv.value, '')) as name, 
    max(if(cfv.cf_id=55, cfv.value, '')) as custom 
from 
    cats c 
    INNER JOIN catlink cl ON c.cat_id = cl.cat_id 
    INNER JOIN links l ON l.link_id = cl.link_id 
    INNER JOIN cfvalues cfv ON cfv.link_id = l.link_id 
group by c.cat_id, l.link_id 

替代使用情況:

select 
    c.cat_name, 
    l.link_name, 
    max(case cfv.cf_id when 54 then cfv.value else '' end) as name, 
    max(case cfv.cf_id when 55 then cfv.value else '' end) as custom 
from 
    cats c 
    INNER JOIN catlink cl ON c.cat_id = cl.cat_id 
    INNER JOIN links l ON l.link_id = cl.link_id 
    INNER JOIN cfvalues cfv ON cfv.link_id = l.link_id 
group by c.cat_id, l.link_id 
+0

哇!感謝您的3種不同的選擇!最後一個使用案例正是我需要的,但會讓其他人蔘考!再次感謝! – user2905054

+0

你能查看我答案旁邊的綠色複選標記嗎?很高興我能幫上忙! – Jeroen