2015-09-05 73 views
0

我是MySQL的新手。我的數據庫是由客戶或webview數據購買的零售產品。例如:如何動態更改where子句中的列?

ID Records 
R1 {iphone5s,levis,Dell,Dior,amazon} 
R2 {levis,Dell,amazon,Starbucks,google glass} 
R3 {iphone5s,Dell,Dior,google glass} 
R4 {iphone5s,levis,Starbucks} 
R5 {iphone5s,levis,Dell,google glass} 

欲將該數據存儲到存儲database.I該數據爲:

ID iphone5s levis Dell Dior amazon Starbucks google glass 

R1  1   1  1  1  1   0   0 

R2  0   1  1  0  1   1   1 

R3  1   0  1  1  0   0   1 

R4  1   1  0  0  0   1   0 

R5  1   1  1  0  0   0   1 


create table retail(ID varchar(50), 
        iphone5s int, 
        levis int, 
        Dell int, 
        Dior int, 
        amazon int, 
        Starbucks int, 
        googleglass int); 

insert into retail 
values ('r1',1,1,1,1,1,0,0), ('r2',0,1,1,0,1,1,1); 

insert into retail 
values ('r3',1,0,1,1,0,0,1),('r4',1,1,0,0,0,1,0),('r5',1,1,1,0,0,0,1); 

現在我想檢索的具有iphone5s ID和存儲的ID。類似,我希望收集具有每個列名的ID並存儲相應的ID。

用java我用下面的代碼收集列名:

ResultSet rs = stmt.executeQuery("SELECT * FROM retail"); 
ResultSetMetaData rsmd = rs.getMetaData(); 
int columnCount = rsmd.getColumnCount(); 
for (int i = 2; i < columnCount + 1; i++) { 
    String name = rsmd.getColumnName(i); 
} 

現在我想從零售where columnname=1選擇ID。

列名應該每次都改變。

+0

它被稱爲查詢生成器 – Drew

+0

@Drew Query Builder的含義是什麼?在這種情況下它將如何提供幫助? – SrividhyaShama

+0

您動態構建您的查詢。其中一個可能是colA ='Jim'的地方,下一個可能完全不同。 – Drew

回答

1

從對問題的評論:

將上述原始數據存儲在數據庫系統中還有其他更好的方法嗎?

絕對。你應該存儲在一個單獨的行購買的每一個項目,像這樣:

ID item 
-- ------------ 
R1 iphone5s 
R1 levis 
R1 Dell 
R1 Dior 
R1 amazon 
R2 levis 
R2 Dell 
R2 amazon 
R2 Starbucks 
R2 google glass 
... 

這使得它更容易查詢(因爲列名不變),你不會有改變你的數據庫結構,如果你需要添加新產品。您可以始終將數據轉換爲現在的格式,但不應該以這種方式存儲數據。

0

您可以在MySQL中使用UNPIVOT等效項。現在,您可以查詢只需使用WHERE brand = 'name' AND is_available = 1

SqlFiddleDemo

create table retail(ID varchar(50), 
        iphone5s int, 
        levis int, 
        Dell int, 
        Dior int, 
        amazon int, 
        Starbucks int, 
        googleglass int); 

insert into retail 
values ('r1',1,1,1,1,1,0,0), ('r2',0,1,1,0,1,1,1), 
     ('r3',1,0,1,1,0,0,1),('r4',1,1,0,0,0,1,0),('r5',1,1,1,0,0,0,1); 

select id 
from 
(
    select 
    t.id, 
    c.brand, 
    case c.brand 
     when 'iphone5s' then iphone5s 
     when 'levis'  then levis 
     when 'Dell'  then Dell 
     when 'Dior'  then Dior 
     when 'amazon'  then amazon 
     when 'Starbucks' then Starbucks 
     when 'googleglass' then googleglass 
    end as is_available 
    from retail t 
    cross join 
    (
    select 'iphone5s' as brand 
    union all 
    select 'levis' 
    union all 
    select 'Dell' 
    union all 
    select 'Dior' 
    union all 
    select 'amazon' 
    union all 
    select 'Starbucks' 
    union all 
    select 'googleglass' 
) c 
) temp 
where brand = 'iphone5s' /* Here your brand/product_name */ 
    and is_available = 1 
order by id;    /* If needed */ 

SqlFiddleDemo_UNPIVOT_TSQL

WITH cte AS 
(
    SELECT ID, Brand, Val 
    FROM 
    (
    SELECT Id, iphone5s, levis, Dell, Dior, amazon, Starbucks, googleglass 
    FROM retail 
    ) t 
    UNPIVOT 
    (
    Val FOR Brand IN (iphone5s, levis, Dell, 
        Dior, amazon, Starbucks, googleglass) 
    ) AS mrks 
) 
SELECT ID 
FROM cte 
WHERE Brand = 'Dior' 
AND [val] = 1;