簡體   English   中英

在MySQL中使用內部連接將列轉換為行

[英]Convert columns into rows with inner join in mysql

請看一下這個小提琴

我正在研究搜索過濾器選擇框,我想將表的字段名稱插入為行。

這是表方案:

CREATE TABLE general
    (`ID` int, `letter` varchar(21), `double-letters` varchar(21))
;

INSERT INTO general
    (`ID`,`letter`,`double-letters`)
VALUES
    (1, 'A','BB'),
    (2, 'A','CC'),
    (3, 'C','BB'),
    (4, 'D','DD'),
    (5, 'D','EE'),
    (6, 'F','TT'),
    (7, 'G','UU'),
    (8, 'G','ZZ'),
    (9, 'I','UU')
;


CREATE TABLE options
    (`ID` int, `options` varchar(15))
;

INSERT INTO options
    (`ID`,`options`)
VALUES
    (1, 'letter'), 
    (2, 'double-letters')
;

options表中的ID字段用作外鍵,我想獲得如下所示的輸出並插入到新表中:

 id   field   value
 1     1       A
 2     1       C
 3     1       D
 4     1       F
 5     1       G
 6     1       I
 7     2       BB
 8     2       CC
 9     2       DD
 10    2       EE
 11    2       TT
 12    2       UU
 13    2       ZZ

我失敗的嘗試:

select DISTINCT(a.letter),'letter' AS field
from general a
INNER JOIN
options b ON b.options = field
union all
select DISTINCT(a.double-letters), 'double-letters' AS field
from general a
INNER JOIN
options b ON b.options = field

可以肯定,您想要這樣:

select distinct a.letter, 'letter' AS field
  from general a
 cross JOIN options b
 where b.options = 'letter'
union all
select distinct a.`double-letters`, 'double-letters' AS field
  from general a
 cross JOIN options b
 where b.options = 'double-letters'

小提琴: http ://sqlfiddle.com/#!2/bbf0b/18/0

需要指出的幾點,您不能加入列別名。 因為要別名的那一列是您要選擇的文字,所以可以在WHERE子句中將該文字指定為條件。

您並不是真正在GENERAL和OPTIONS之間加入任何東西,所以您真正想要的是CROSS JOIN; 您放入ON子句中的條件實際上屬於WHERE子句。

我只是在Oracle上進行了此查詢。 它可以工作並產生您描述的輸出:

SELECT ID, CASE WHEN LENGTH(VALUE)=2THEN 2 ELSE 1 END AS FIELD, VALUE  
FROM (
SELECT rownum AS ID, letter AS VALUE FROM (SELECT DISTINCT letter FROM general ORDER BY letter)
UNION
SELECT (SELECT COUNT(DISTINCT LETTER) FROM general) +rownum AS ID, double_letters AS VALUE
 FROM (
    SELECT DISTINCT  double_letters FROM general ORDER BY double_letters)
)

它也應該在Mysql上運行。

我沒有使用options表。 我不明白他的角色。 對於此示例,這種類型的輸出似乎沒有必要

希望這可以幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM