[Redash] MySQL 基本 query 與強大的 Table 功能

Mars Weng
MarsW-Redash
Published in
6 min readOct 15, 2018

接續著上一篇環境安裝完畢,再來就是要增加 Data Source,
不過赫然發現 self hosted 的版本比線上少了:
CSV (from URL)、Cassandra、Oracle、ScyllaDB、Snoflake,
是有多出 Sqlite (Python 的部分還要特別設定,後續章節會再介紹),
不知道後面有沒有時間來的去研究線上多出的這些是官方文件寫錯,
還是跟 Python 一樣要特別設定才能支援。

這次串接和 Redash 體驗那篇文章中 NBA dataset 同一個 MySQL server,
只不過這次換成了 IMDB 來試試
https://relational.fit.cvut.cz/dataset/IMDb

可以發覺不管哪個 dataset , host、帳密等都一樣,不同的點是 database ,那在 Redash 之中,雖然設定頁面 Database Name 必填,但其實如果 host、帳密相同,而且有同樣的權限,是可以只要設定一個 Datasource ,在 Query 裡面透過指定 database 的方式也是可以跨 db 搜尋

可以看到在 Query 介面中,最左方區塊是 Datasource,
以我們剛建立的 RELATIONAL 為例,雖然 Database Name 填的是 imdb_ijs
照理說只會顯示 directors_genres, directors, movies_directors, movies_genres, movies, roles, actors 這幾張 table,
但如果以「movie」下去 filter,會看到其他 database 的 table 以及相關欄位,他的名稱會以「db_name.table_name」的方式呈現,也是同樣能直接以SQL去query。

eg. 以下例子是搜尋 database 為 imdb_small 的 directors 這張 table

SELECT * FROM imdb_small.directors

而在如果 query 的 db 是和 datasource 設定的相同,是可以省略 db 直接寫 table 名稱就好

SELECT * FROM movies

按下 Execute 就可以 query 出結果

以 IMDB dataset 來說,大家看電影除了電影內容之外,演員也是一個很重要的元素,我們就來 query 出 movies 與 actors 的資料,也一起體驗 Redash 預設 Visualization 但很強大的 Table 功能:

SELECT movies.name AS movie,
CONCAT("<a href='https://www.imdb.com/find?q=",movies.name,"' target='_blank'>search on IMDB</a>" ) as search,
movies.year, CONCAT(actors.first_name,' ',actors.last_name) AS actor
FROM movies
INNER JOIN roles ON movies.id = roles.movie_id
INNER JOIN actors ON roles.actor_id = actors.id
WHERE movies.year > 2002
ORDER BY year DESC
LIMIT 1000

當然 Table 少不了的排序功能,就算 SQL 中有指定預設欄位的排序方式,
在 Redash 的 Table Visualization 也是可以單獨對某一欄位做排序。

看到這邊,會想說上面 SQL 還有跑出來的結果,為什麼要寫一段 HTML 內容在裡面,這算是 Table Visualization 的功能之一,我們進到
「Edit Visualization」來一探究竟!

在 Table Visualization 的編輯選項中,我們可以針對每個欄位設定是否要顯示、內容對齊方式,以及調整排列順序。

另外大部分的數字我們會習慣有千位一個逗號的格式,但很少會對年份做這種格式,裡面也可以針對 Number format 做調整。

而 Display as 可以設定顯示的類別,像是還有 Link 可以選擇,就可以按照 Redash 規定的 format,建立出超連結,同時也對 Text 顯示方式支援 HTML 內容 (Allow HTML content),

因此可以看到 SQL 建立出包含 HTML 內容的 「search on IMDB」欄位,
與 使用 Link 顯示方式的 movie 欄位有相同的超連結功能。

如果欄位有勾選 「Use for Search」,Redash 會在資料顯示的上方產生一個 search bar,針對所有的欄位找尋是否出現該關鍵字,以圖中為例,就是找尋在 movie 或是 actor 有出現「Phoenix」的關鍵字
(不過就沒有像 jQuery DataTables 可以針對每個 col. 做 searching 那麼強大)

使用案例

Redash Table 的功能基本上概括了最常用的報表功能,
個人在公司的案例是通常內部需要各種總表式的表格

eg. 訂單列表,通常希望可以搜尋顧客姓名、產品名稱,也能以下訂日期排序….etc,不同部門可能在乎的資料欄位不同,就可以調整 Table Visualization 設定中不同的欄位顯示與排列,來達到各自的需求。

如果按照以前就是要先拉 SQL 出來,然後再套版跟調整 DataTables 的 js 參數,然後再把連結 link 到公司內部的後台系統。

Redash Table 基本上算是可以取代掉這部分的工,只要專心取得正確的資料就好,而且也能確保同樣的 query 內容在多張報表間,不會有重複 SQL 在各地的程式碼中出現,造成未來維護的麻煩。

此為系列文章,傳送門在此

--

--