2015-06-21 169 views
-2

我有這些表,並在一個帶有用戶名和密碼的查詢(登錄時)我想從右表中選擇數據。 例如:在用戶表中有字段權限。 管理員擁有權限1,供應商擁有權限2,並且客戶擁有權限3. 謝謝。我需要MYSQL查詢解決方案

+------------+--+----------+--+-----------+--+-------------+ 
| user | | admin | | vendor | | customer | 
+------------+--+----------+--+-----------+--+-------------+ 
| id_user | | id_admin | | id_vendor | | id_customer | 
| username | | id_user | | id_user | | id_user  | 
| password | | name  | | name  | | name  | 
| permission | | surname | | surname | | surname  | 
+------------+--+----------+--+-----------+--+-------------+ 
+1

很明顯,您的解決方案將會是一些帶有一些JOIN子句的SQL語句,但在您更好地解釋關係需求之前,不可能專門爲您提供幫助。 'user.permission'如何映射到'admin'「權限」? –

+0

好的謝謝。我試過了,它適用於這些查詢。 $ query =「SELECT * FROM user INNER JOIN admin ON admin.id_user = user.id_user WHERE user ='$ username'and password ='$ password'limit 1」;但我會添加 「如果(權限== 1)爲管理員或如果(權限== 2)供應商或如果(權限== 3)爲客戶」 並執行單個查詢,使自動選擇正確的表,檢索數據。 – Miks

+0

基於像這樣的列值對不同表進行條件連接被認爲是非常糟糕的做法,並且通常在不正確的關係數據庫設計中存在根本原因。可以將它壓縮爲僅僅一個SQL查詢,但是它會很昂貴(每次總是不需要2個連接時會加入3個連接),並且需要對結果進行空檢查。如果不進行任何模式更改,最好將其作爲2階段查詢。首先查詢用戶表,然後根據第一個查詢結果的'permission'值,僅查詢所需的表。 –

回答

1

要跟進我的意見,沒有理由(不包括大量的重構時間承諾)這4個表無法被非歸到一個表中的所有相同的信息如下:

+------------+ 
| user | 
+------------+ 
| id_user | 
| username | 
| password | 
| permission | 
| name  | 
| surname | 
+------------+ 

這裏permission代表用戶類型(管理員,供應商或客戶)。如果用戶可能屬於多個類別(例如,用戶既是客戶又是供應商),那麼您可以將permission視爲(bit) flag field(或者您可以將其分成3個獨立的布爾字段is_X)。這樣做有許多下游收益,可能並不明顯。例如,您現在將一個id_user外鍵轉換爲任何其他相關表,而不是可能的4個不同的外鍵。

總是試圖記住的關係數據庫設計,經過時間考驗的規則:「正常化,直到它傷害,然後去正常化,直到它的工作原理」。去歸一化的動機幾乎總是昂貴的查詢,需要不斷的JOIN或不必要的密鑰分叉。