[英]sql query that depends on each value of other table
我不習慣查詢句子,這個有點棘手,我不知道是否可能(至少只有一個 sql 查詢)或者我是否應該將問題名稱更改為更准確的名稱,如果所以讓我知道。
我有兩張桌子,我會讓它們變得簡單。 第一個關於游戲的有一個名稱和一個details_id
,另一個關於游戲細節的有details_id
(外鍵), locale
和description
。
游戲 |
---|
名稱 |
詳細信息_id |
細節 |
---|
詳細信息_id |
語言環境 |
描述 |
一個游戲可以關聯多個詳細信息,因為details_id
不是唯一的。 所以我可以有 3 個具有相同 id 的詳細信息表與一個游戲相關聯,但是沒有與其他游戲具有相同details_id
的游戲。 我舉個例子:
游戲
名稱 | 詳細信息_id |
---|---|
馬里奧卡丁車 | 007 |
細節
詳細信息_id | 語言環境 | 描述 |
---|---|---|
007 | 英文 | 一款不錯的賽車游戲。 |
詳細信息_id | 語言環境 | 描述 |
---|---|---|
007 | es-ES | Un buen juego de carreras。 |
我在視圖中顯示了所有游戲及其英文描述,它們現在按描述排序如下:
SELECT Games.name, Details.description
FROM Games
INNER JOIN Details ON Details.locale='en-GB'
訣竅是我希望它取決於語言環境,它們可能是未翻譯成與其他語言環境相同的游戲。
目標是一個 select ,通過連接,可以 select 所有游戲名稱和詳細描述按description
排序,其中語言環境為es-ES
,如果詳細信息不存在,它將采用en-GB
仍然按字母順序在西班牙語中排序說明。
在這里我添加了第二個只有英文描述的游戲。 我們兩次連接到詳細信息表,一次提取英語描述,一次提取西班牙語描述。 我們使用 function COALESCE,它返回第一個不是 null 的值,即。 如果有西班牙文,如果沒有西班牙文,則英文。
請查看底部的 dbFiddle 鏈接以了解架構並進一步測試。
select * from games; select * from details;
姓名 | details_id:------------ | --------:馬里奧卡丁車 | 7 忍者之戰 | 5 詳細信息_id | 語言環境 | 描述 ----------: |:----- |:------------------------ 7 | zh-CN | 一款不錯的賽車游戲。 7 | es-ES | Un buen juego de carreras。 5 | zh-CN | 街頭格斗游戲。
select name, coalesce(esp.description, eng.description) Description from games g left join (select details_id, description from details where locale = 'en-GB') eng on g.details_id = eng.details_id left join (select details_id, description from details where locale = 'es-ES') esp on g.details_id = esp.details_id
姓名 | 描述:------------ |:------------------------ 馬里奧卡丁車 | Un buen juego de carreras。 忍者之戰 | 街頭格斗游戲。
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.