2010-01-30 72 views
1

我相信我正在看這個錯誤的方式。不同的一列,並顯示下面的其他列

我想在數據庫中放置一個餐廳菜單並顯示它。例如,我創建類似下面的一個表:

列:

Food_Item | Food_Description | Food_Price | Food_CAT.

數據:

沙拉|清爽的沙拉| 5.25 |起泡器
蝦雞尾酒|可愛的蝦| 4.75 |起泡劑
番茄湯|西紅柿奶油| 4.50 |湯
牛排|可愛的臀部牛排| 10.95 |市電
魚&芯片| Classc盤| 8.75 |電源

我所試圖實現的是一個菜單佈局,其中food_CAT充當頭,然後將不同的菜現介紹如下,例如:

首發
沙拉 - 5.25
蝦雞尾酒 - 4.75


番茄湯 - 4.50

電源
牛排 - 10.95
魚&芯片

等。

有一個簡單的方法來做到這一點,所以我沒有每個盤子上面的food_cat標題,只有第一個?我想我可以使用DISTINCT,但是從閱讀其他文章,我明白幾乎不可能DISTINCT一列。

希望有人能幫助。

問候, 奧利弗

回答

1

做到這一點的方法是在顯示屏上,不在查詢。

在查詢的SELECT語句中包含Food_CAT。它將包含在每個檢索的記錄中。

使用ORDER BY首先按Food_CAT對項目進行排序,然後按您想要的任何列排序,可能爲Food_ItemFood_Description

然後,無論您選擇顯示結果的任何方法,您都會遍歷查詢,並在每次該字段的值更改時添加一行只顯示Food_CAT的行。在顯示標題記錄之後,您將顯示與Food_CAT匹配的記錄,依此類推。

+0

嗨DOK。你能解釋一下當字段改變時如何顯示字段的值嗎?謝謝 – Oliver 2010-02-01 11:01:28

+0

這取決於您何時以及如何顯示結果。一種方法是將一列ModifiedDate添加到表中,然後SELECT WHERE ModifiedDate大於某個基準日期。另一種方法涉及數據庫觸發器(當記錄發生變化時),但看起來非常複雜。 – DOK 2010-02-03 13:30:15

1

我的印象是,你問如何在SELECT語句中做到這一點,而不是使用遊標。如果情況並非如此,那麼使用遊標有更好的答案,可以消除我答案中的一些垃圾。還有一些報告工具特定的答案比這兩個都好得多(但你沒有提到使用報告工具)。

的關鍵是,你必須要弄亂兩個數據集:

  • 標題的列表
  • 的項目和價格

第一步將它們組合在一起就是讓數據集匹配,因此您需要將項目和價格合併到一個字符串中。接下來是包含你想要排序的數據,它是food_cat,還有一些將標題排序到food_cat的頂部,以及下面的item/price字符串。你到底是什麼了看起來像:

select distinct food_cat as display, 
food_cat, 
1 as sort_order 
from temp_food 

union 

select food_item + ' - ' + cast (food_price as varchar), 
food_cat, 
2 
from temp_food 

order by food_cat, sort_order 

當然,你必須在你不想顯示該數據集的額外列,但是這件事情你必須處理的另一個層面。

祝你好運,

特里。

0

SQL是不是在單個ResultSet混合和匹配不同種類的行很好的,即它會採取一種過於複雜的查詢,在單個ResultSet這樣的返回數據:

Starters | n/a 
Salad | 5.25 
Prawn Cocktail | 4.75 
Soups | n/a 
Tomato Soup | 4.50 
Mains | n/a 
Steak | 10.95 
Fish & Chips | 8.75 

你」 d最好使用JOIN水平鏈接數據,然後在客戶端應用程序中進行一些處理以在菜單結構中顯示數據。

SELECT Food_CAT, Food_Item, Food_Price FROM xx ORDER BY Food_CAT 

然後在客戶端應用程序,通過ResultSet是這樣的循環:

$foodtype = '' // a variable to store which category of food you're currently on 
FOR EACH row in myresults: 
    IF myresults.Food_CAT <> $foodtype // another item in the existing category 
    PRINT myresults.Food_Item + myresults.Food_Price 
    ELSE // new category 
    $foodtype = myresults.Food_CAT 
    PRINT blankline 
    PRINT myresults.Food_CAT 
    PRINT myresults.Food_Item + myresults.Food_Price 
+0

感謝vincebowdren,這看起來不錯,我會稍後再試一試。我必須承認,我真的爲此付出了努力,並且採取了欺騙手段。我決定使用jQuery來過濾food_cat的結果,並在第一次之後刪除所有的頭文件。好吧,它不會優雅地退化,但它是一個可行的答案。我一定會給你答案。謝謝。 – Oliver 2010-02-10 11:11:09

相關問題