簡體   English   中英

mysql根據條件切換到備用表

[英]mysql switch to alternative table depending on conditions

這篇文章對此很抱歉,但問題也很復雜。

使用mysql和php,
我可以用3個sql請求解決問題,但不能在1或2中解決。

所以這就是為什么我在這里發布:
你們中有誰知道用不到3招就能做到的方法嗎?

(對不起我的英語不好)

首先讓我解釋一下上下文:
關於主題公園!

所以有主題公園的主人,
他擁有一個具有不同區域的主題公園,每個區域都包含游戲。
根據游戲管理員(負責游戲的人員)的說法,每個游戲都可以使用不同的設置進行設置。

這是架構中有趣的部分
有5張桌子

themeparkzone
--name(varchar)

themeparkzone_has_game_with_manager
--themeparkzone_id(pk)
--game_id(pk)
--manager_id(fk)
--game_settings(文字)

themeparkzone_has_game
--themeparkzone_id(pk)
--game_id(pk)
--game_settings(文字)

游戲
--name(varchar)

經理
--name(varchar)

兩張表可能需要更多說明:

themeparkzone_has_game_with_manager和themeparkzone_has_game。

如果themepark所有者編寫了主題公園,則themeparkzone_has_game可以保留游戲的默認設置。

然后themeparkzone_has_game_with_manager保留game_manager已(或尚未)設置的游戲設置,
設置時,這些設置應覆蓋themeparkzone_has_game表中的默認設置。

因為主題公園所有者希望他的主題公園具有吸引力,所以他計划每天更改設置,
這是他和他的團隊必須處理的約定:

決定將應用哪些游戲設置,

我們在啟動時給出了以下變量:
-manager_id:例如22。
-今天的themeparkzone ID,例如12,13,14

因此,最終目標是:
對於給定的manager_id和給定的themeparkzone_ids,
找出游戲的名稱和設置,

鑒於 :
如果在themeparkzone_has_game_with_manager中設置了設置,它將應用
其他
如果在themeparkzone_has_game中設置了設置,它將應用
其他
沒有游戲。

那就是我的問題
而且因為我無法在1個請求內完成,
我第一次請求循環themeparkzone_ids,
因此,現在的問題是找到給定manager_id和給定themeparkzone_id的游戲名稱和設置。

此時,我可以在兩個請求中完成此操作,但是我想知道是否可以在一個請求中完成。

我的要求是:

選擇g.name,w.game_settings
從游戲g
INNER JOIN themeparkzone_has_game_with_manager w on w.game_id = g.id
在哪里w.manager_id = 22
AND w.themeparkzone_id in(12,13,14)

選擇g.name,h.game_settings
從游戲g
在h.game_id = g.id上加入INNER JOIN themeparkzone_has_game h
在哪里h.themeparkzone_id(12,13,14)

對於它們中的每一個,我將結果數組放入php數組,然后根據約定將它們混合。

所以我想知道是否有一種方法可以解決mysql請求中的條件,而不是用php來解決。

一個將執行以下操作的請求:
foreach(themeparkzone_id和manager_id)
如果在themeparkzone_has_game_with_manager中存在匹配的設置
接受,
其他
如果在themeparkzone_has_game中存在匹配的設置
接受,
其他
takenothing。

希望有人能理解我的解釋。

考慮到您的數據庫布局,我認為更改某些內容可能會更好。

我將themeparkzone_has_game_with_managerthemeparkzone_has_game_with_manager放在一個表中。 然后,我將創建一個新的表games_managers ,該表建立了哪些經理可以管理哪些游戲的連接。

然后我認為,應該可以用更少的請求做到這一點。

請注意,您必須自己計算詳細信息,即,如果每個游戲都需要有經理,則可以為每個游戲指定標志。

您可以使用LEFT JOINCOALESCE進行此操作。

SELECT
    g.name,
    COALESCE(w.game_settings, h.game_settings)
FROM
    game AS g
    INNER JOIN themeparkzone_has_game AS h ON h.game_id = g.id
    LEFT JOIN themeparkzone_has_game_with_manager AS w ON
        w.game_id = g.id AND
        w.themeparkzone_id = h.themeparkzone_id AND
        w.manager_id = 22
WHERE
    h.themeparkzone_id IN (12, 13, 14)

不像INNER JOIN ,一個LEFT JOIN總是包含在左側表中的每一行的至少一排,即使有在右邊的表中沒有行匹配的連接條件。 在這種情況下,右側表中的列將全部為NULL COALESCE()返回提供的第一個非NULL值,因此,如果themeparkzone_has_game_with_manager中沒有匹配的行,它將從themeparkzone_has_game返回game_settings值。

萬歲,
我終於找到了轉身
對於像我這樣的新手來說有點混亂,但是它可以工作,並且…
只有結果很重要...

這是與我的需求相對應的請求:
謝謝大家的幫助:

選擇
聚結(g.name,g2.name),
合並(w.params,h.params)

themeparkzone z
左聯接themeparkzone_has_game_with_manager w ON w.themeparkzone_id = z.id AND w.manager_id = 2
在h.themeparkzone_id = z.id上向左加入themeparkzone_has_game h
左加入游戲g ON g.id = w.game_id
向左加入游戲g2到g2.id = h.game_id,z.id在(12,13,14)

因此,此請求將在themeparkzone_has_game_with_manager表中獲取結果,如果未找到結果,則嘗試從themeparkzone_has_game中獲取結果,如果兩者均未找到,則仍返回空結果。
希望它可以幫助某人。

暫無
暫無

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

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