Mysql

是否可以重命名結果集的列?

  • October 11, 2017

我有兩個表連接在一個 ID 上。

它們可能看起來像這樣:

table_overview  
| id | version | description |
------------------------------
| 1  | 1.2.3   | new stuff.. |


table_files
| id | type    | file_name   |
------------------------------
| 1  | TEXT    | as.txt      |
| 1  | IMG     | abc.png     |
| 1  | AUDIO   | def.wav     | 

其中table_overview的主鍵是id,table_files的主鍵是id和type。

我想返回一個結果集,其中每一行都包含所有資訊,但將標題 file_name 替換為類型,因此結果集中的一行看起來像這樣:

| id | version | description | text   | img     | audio   |
| 1  | 1.2.3   | new stuff.. | as.txt | abc.png | def.wav |

這樣的事情可能嗎?還是我最好一開始就以這種方式創建表格。

最初的想法是將來添加新類型應該很容易。

如果您有一組固定的屬性並且每個實體最多有一個值,那麼您可以執行以下操作:

SELECT o.id, o.version, o.description
    , t.file_name AS text
    , i.file_name AS img
    , a.file_name AS audio
FROM   table_overview AS o
LEFT OUTER JOIN 
      table_files AS t ON t.id=o.id AND t.type = 'TEXT'
LEFT OUTER JOIN 
      table_files AS i ON i.id=o.id AND i.type = 'IMG'
LEFT OUTER JOIN 
      table_files AS a ON a.id=o.id AND a.type = 'AUDIO'

或者如果每個屬性總是有一行(即,如果沒有值,該行將存在一個 NULL 值,而不是根本沒有屬性的行)對於每個實體,使用內部連接可能更有效:

SELECT o.id, o.version, o.description
    , t.file_name AS text
    , i.file_name AS img
    , a.file_name AS audio
FROM   table_overview AS o
JOIN   table_files AS t ON t.id=o.id AND t.type = 'TEXT'
JOIN   table_files AS i ON i.id=o.id AND i.type = 'IMG'
JOIN   table_files AS a ON a.id=o.id AND a.type = 'AUDIO'

如果任何給定實體可能有多個屬性(例如,如果一個概覽行可能有多個圖像文件),那麼這將變得更加複雜。

正如 Raymond 所提到的,使用GROUP BY和聚合也可以改善性能,這取決於有多少屬性、查詢中還有哪些其他過濾子句以及表的索引方式。在許多情況下它會更好,但在某些情況下它會明顯更糟(特別是在過濾一個轉置屬性或從每個項目可能包含許多屬性的袋子中挑選一些屬性時),因為會導致掃描其中少量否則, seeks 可能就足夠了:

SELECT o.id, o.version, o.description
    , MAX(IF(type = 'TEXT' , file_name, NULL)) AS text
    , MAX(IF(type = 'IMG'  , file_name, NULL)) AS img
    , MAX(IF(type = 'AUDIO', file_name, NULL)) AS audio
FROM   table_overview AS o
LEFT OUTER JOIN
      table_files AS f ON f.id=o.id
GROUP BY o.id, o.version, o.description

您需要測試/基準測試您的應用程序以查看此方法是否更快。

在 SQL Server 等其他數據庫中,有一些PIVOT功能可以讓這種事情變得不那麼麻煩,但 IIRC mySQL 還沒有這樣的功能。

如果您沒有需要轉置的一組固定屬性,那麼您將被迫使用由應用程序層或通過儲存過程生成的 ad-hoc SQL(請參閱http://buysql.com/mysql/14- how-to-automate-pivot-tables.html是後者的一個例子)。即使在具有PIVOT/ UNPIVOT/equivelant 的數據庫中也是如此,因為這些功能通常是在考慮固定屬性/列的情況下實現的。

引用自:https://dba.stackexchange.com/questions/188177