2012-01-18 53 views
3

我讀過這是一個禁忌,但我想知道這是否總是這樣。我有一張可以容納一系列座位的「餐桌」。
enter image description here在MySQL中存儲逗號分隔的數據

您可以在圖像中看到table_num 12將容納2或3個座位。

所以,現在我現在的解決方案是查詢所有的表記錄(根據user_index爲未公開的原因),然後循環查找可以容納3人的表的結果(如果碰巧有三個人在尋找表)。

我這樣做是通過在我的返回數據的'席位'列上使用array_implode()方法(在php中)來實現的。我覺得這比創建一個單獨的「席位」表,然後爲每個席位可能性分配一個table_index和user_index,然後必須運行第二個查詢來查找原始「表」表中的table_num更容易。

基本上,通過使用array_implode()我能夠繞過第二個查詢。但是,我不知道這是不是很重要。或者,可能我錯過了一些很棒的查詢語言(如關係表術語?)

+1

只是好奇。爲什麼座位3的桌子總不能坐2?換句話說,爲什麼不能將該列稱爲「max_seats」? – webbiedave 2012-01-18 19:02:14

+0

@webbiedave,這不是一個真正的世界範例。原因是會有一張桌子可容納5或6人,但我們不希望2人坐在那裏,而'max_seats'會在桌子上分配不需要的人數。還有一些其他的雜項。情況與組合的表號碼。 – 2012-01-18 19:15:35

+0

如果您想在組合字段中查找包含10的記錄,會發生什麼情況?如果您將組合數據放在第二個表中,則不需要第二個查詢,只需在您的查詢中加入一個JOIN – 2012-01-18 19:34:29

回答

2

如果您刪除從該表中的seats列,然後有一個新的seats表有三列:idtable_indexnum_seats,其中table_index涉及到index在您現有的表(多到一個因爲可能存在每桌seats多個entires)。你可以選擇你喜歡的表格:

SELECT tables.* FROM tables 
INNER JOIN seats ON tables.index = seats.table_index 
WHERE seats.num_seats = ? 
4

創建一個名爲類似TableSeats的表。其中,你會有一個table_num和一個seats列。使用table_num列作爲外鍵。然後,找表是座3人,它會像這樣:

select 
    * 
from 
    tables t 
where 
    exists (select 1 from tableseats s where s.seats = 3) 

這裏的法寶是exists條款。當然,你也可以做一個inner join,但是我建議你在這裏推薦exists,因爲這可以讓你找到任何可以容納至少7個人的餐桌,通過說where s.seats >= 7,或甚至可以容納5至8人的餐桌,where s.seats between 5 and 8

+0

那麼,外鍵是自動填充的嗎? – 2012-01-18 18:59:56

+1

@Jascha - 不,它所做的只是確保'table_num' *中填充的值具有*存在於'Tables'表中。您需要手動或一次性編程負載來填充表格。 – Eric 2012-01-18 19:01:22

+0

它看起來像加入方法最適合這種特殊情況。有些情況下,我不想在一個6人桌上坐2人。我沒有在我的問題中提到過......我感覺不好,但有人專門用連接方法(和示例)回答,所以我覺得我必須給他對號。我當然會給你一點意見。 – 2012-01-18 19:10:43

4

糾正我,如果我錯了,但這聽起來不是一個列表。它更像是一個範圍(比如從2到3個座位)。因此,您可以通過將字段min_seatsmax_seats替換爲seats字段來獲得更好的結構。查詢很直接。

+1

這是一個很好的觀點,但在這種特殊情況下,我寧願將它保留爲列表(可能會出現表格被加入等情況) – 2012-01-18 19:05:27

+0

好的,然後去一張新表格。如果你可以將列表存儲到一個字段中,那麼我可以說只有當你不想在該字段上運行查詢時纔可以。在你的情況下,它確實是一個NO-NO :-) – linepogl 2012-01-18 19:10:43

相關問題