Mysql

以所需格式獲取結果集的問題

  • June 23, 2015

我有 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 |

SQL小提琴

由於您沒有指定您正在使用的程式語言,但是在 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));
       }
   }

引用自:https://dba.stackexchange.com/questions/41394