Mysql
以所需格式獲取結果集的問題
我有 2 個具有以下列的表
Person ------ person_id, first_name, middle_name, last_name Items ----- person_item_id, person_id, item_type, status, ordered_date
查詢是
select Person.person_id as PID, Group_concat(Items.item_type) AS ITYPE, Group_concat(Items.status) AS STATUS, Group_concat(Items.orderd_date)AS ODATE, Group_concat(Items.person_item_id) AS IID from Persons inner join Items ON Person.person_id = Items.person_id group by person_id;
返回的結果集如下
PID ITYPE STATUS ODATE IID 1 A,A,B,C Y,N,Y,Y 2/5/2012,5/5/2012,17/5/2012 1,1,2 2 A,B Y,N 5/5/2012,15/6/2012 1,2
一個人可以有多個 item_type 並且可以多次訂購同一個項目,我想以這樣一種方式顯示記錄集,即無論該項目是否由人購買,如果該項目存在於記錄集中,我正在繪製一個列並且必須顯示與該結果相對應的結果,如果該項目被購買 3 次,那麼我想顯示該項目及其相應的記錄,即 order_date、status 等按順序顯示。
例如: -
如果有 3 個項目 A、B、C,則輸出應在螢幕上顯示為:-
PID ABC 1 年 2/5/2012 5/5/2012 7/5/2012 ----------- 和 17/5/2012 2YN 12/6/2012 15/6/2012
現在假設有另一個項目,所以我正在做的是首先從上面的查詢中獲取結果集,然後遍歷該結果集以檢查該項目的存在&如果該項目存在,我正在顯示它&它是相應的值,所以第一次我必須遍歷整個結果集以獲取 item_type,然後必須顯示它。
我認為您需要第三張表orders,它連接物品和人員。
表
CREATE TABLE IF NOT EXISTS `persons` ( `person_id` int(4) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, PRIMARY KEY (`person_id`) ); CREATE TABLE IF NOT EXISTS `items` ( `item_id` int(4) NOT NULL AUTO_INCREMENT, `item_type` varchar(50) NOT NULL, PRIMARY KEY (`item_id`) ); CREATE TABLE IF NOT EXISTS `orders` ( `order_id` int(12) NOT NULL AUTO_INCREMENT, `item_id` int(4) NOT NULL, `person_id` int(4) NOT NULL, `status` varchar(50) NOT NULL, `ordered_date` date NOT NULL, PRIMARY KEY (`order_id`) );
數據
INSERT INTO `persons` (`name`) VALUES ('Walter White'), ('John Locke'); INSERT INTO `items` (`item_type`) VALUES ('A'), ('B'), ('C'); INSERT INTO `orders` (`person_id`, `item_id`, `status`, `ordered_date`) VALUES (1, 1, 'Y', '2012-5-2'), (1, 2, 'N', '2012-5-5'), (1, 3, 'Y', '2012-5-7'), (1, 1, 'Y', '2012-5-17'), (2, 1, 'Y', '2012-6-12'), (2, 2, 'N', '2012-6-15');
詢問
SELECT orders.person_id AS PID, GROUP_CONCAT(items.item_type) AS ITYPE, GROUP_CONCAT(status), GROUP_CONCAT(ordered_date) FROM orders INNER JOIN items ON items.item_id = orders.item_id GROUP BY person_id, orders.item_id
結果
| PID | ITYPE | GROUP_CONCAT(STATUS) | GROUP_CONCAT(ORDERED_DATE) | ------------------------------------------------------------------- | 1 | A,A | Y,Y | 2012-05-02,2012-05-17 | | 1 | B | N | 2012-05-05 | | 1 | C | Y | 2012-05-07 | | 2 | A | Y | 2012-06-12 | | 2 | B | N | 2012-06-15 |
由於您沒有指定您正在使用的程式語言,但是在 asp.net c# 中,在列印結果數據集或數據表時,您可以格式化您的字元串,例如;
// 創建一個包含 1940-1950 年美國三個城市人口數據的 5 元組數組。
Tuple<string, DateTime, int, DateTime, int>[] cities = { Tuple.Create("Los Angeles", new DateTime(1940, 1, 1), 1504277, new DateTime(1950, 1, 1), 1970358), Tuple.Create("New York", new DateTime(1940, 1, 1), 7454995, new DateTime(1950, 1, 1), 7891957), Tuple.Create("Chicago", new DateTime(1940, 1, 1), 3396808, new DateTime(1950, 1, 1), 3620962), Tuple.Create("Detroit", new DateTime(1940, 1, 1), 1623452, new DateTime(1950, 1, 1), 1849568) }; // Display header string header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n", "City", "Year", "Population", "Change (%)"); Console.WriteLine(header); string output; foreach (var city in cities) { output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}", city.Item1, city.Item2, city.Item3, city.Item4, city.Item5, (city.Item5 - city.Item3)/ (double)city.Item3); Console.WriteLine(output);
該範例顯示以下輸出: City Year Population Year Population Change (%)
Los Angeles 1940 1,504,277 1950 1,970,358 31.0 % New York 1940 7,454,995 1950 7,891,957 5.9 % Chicago 1940 3,396,808 1950 3,620,962 6.6 % Detroit 1940 1,623,452 1950 1,849,568 13.9 %
即使您可以循環您的結果集,並且在列的 foreach 循環中,您也可以使用此 string.format。例如。
foreach(datarow r in dt.rows) { foreach(column c in dt.columns) { system.console.writeline(String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy} {4,12:N0}{5,14:P1}",city.Item1, city.Item2, city.Item3, city.Item4, city.Item5, (city.Item5 - city.Item3)/ (double)city.Item3)); } }