Hướng dẫn how do i combine multiple rows into one in mysql? - làm cách nào để kết hợp nhiều hàng thành một trong mysql?

Cảm ơn trước, tôi dường như không thể có được nó!

Tôi có hai bảng

Ordered_Item

ID | Item_Name
1  | Pizza
2  | Stromboli

Ordered_Options

Ordered_Item_ID | Option_Number | Value
        1               43         Pepperoni
        1               44         Extra Cheese
        2               44         Extra Cheese

Những gì tôi đang tìm kiếm để đầu ra là một truy vấn MySQL là một cái gì đó cho hiệu ứng này

Đầu ra

ID | Item_Name | Option_1 | Option_2
1    Pizza       Pepperoni  Extra Cheese
2    Stromboli     NULL     Extra Cheese

Tôi đã thử nhiều tùy chọn nhất trong lỗi cú pháp, tôi đã thử group_concat nhưng đó không thực sự là những gì tôi đang tìm kiếm. Tôi có một ví dụ thô thiển dưới đây về những gì tôi nghĩ có thể là một khởi đầu. Tôi cần các tùy chọn để theo cùng một thứ tự mỗi lần. Và trong chương trình mà thông tin được thu thập, không có cách nào đáng tin cậy đảm bảo điều đó sẽ xảy ra. Có thể có chúng liên kết theo số tùy chọn. Ngoài ra tôi biết rằng tôi sẽ không bao giờ có hơn 5 tùy chọn nên một giải pháp tĩnh sẽ hoạt động

Select Ordered_Items.ID,
    Ordered_Items.Item_Name,
FROM Ordered_Items
    JOIN [SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 43] as Option_1 
        ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID
    JOIN [SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 44] as Option_2 
        ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID;

Cảm ơn! Joe

Kermit

33.4K13 Huy hiệu vàng83 Huy hiệu bạc120 Huy hiệu đồng13 gold badges83 silver badges120 bronze badges

hỏi ngày 1 tháng 7 năm 2009 lúc 5:34Jul 1, 2009 at 5:34

0

Cách dễ nhất là sử dụng chức năng nhóm nhóm_concat ở đây ..

select
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  GROUP_CONCAT[Ordered_Options.Value] as `Options`
from
  ordered_item,
  ordered_options
where
  ordered_item.id=ordered_options.ordered_item_id
group by
  ordered_item.id

Cái nào sẽ xuất hiện:

Id              ItemName       Options

1               Pizza          Pepperoni,Extra Cheese

2               Stromboli      Extra Cheese

Bằng cách đó, bạn có thể có bao nhiêu tùy chọn như bạn muốn mà không phải sửa đổi truy vấn của mình.

À, nếu bạn thấy kết quả của mình bị cắt, bạn có thể tăng giới hạn kích thước của nhóm_concat như thế này:

SET SESSION group_concat_max_len = 8192;

Đã trả lời ngày 1 tháng 7 năm 2009 lúc 5:43Jul 1, 2009 at 5:43

4

Tôi đánh giá cao sự giúp đỡ, tôi nghĩ rằng tôi đã tìm ra một giải pháp nếu ai đó sẽ bình luận về hiệu quả mà tôi sẽ đánh giá cao nó. Về cơ bản những gì tôi đã làm là. Tôi nhận ra nó có phần tĩnh trong việc thực hiện nhưng tôi làm những gì tôi cần nó để làm [tha thứ cho cú pháp không chính xác]

SELECT
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  Options1.Value
  Options2.Value
FROM ORDERED_ITEMS
LEFT JOIN [Ordered_Options as Options1]
    ON [Options1.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID 
        AND Options1.Option_Number = 43]
LEFT JOIN [Ordered_Options as Options2]
    ON [Options2.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID
        AND Options2.Option_Number = 44];

Kermit

33.4K13 Huy hiệu vàng83 Huy hiệu bạc120 Huy hiệu đồng13 gold badges83 silver badges120 bronze badges

hỏi ngày 1 tháng 7 năm 2009 lúc 5:34Jul 1, 2009 at 6:59

2

Cách dễ nhất là sử dụng chức năng nhóm nhóm_concat ở đây ..

select
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  if[ordered_options.id=1,Ordered_Options.Value,null] as `Option1`,
  if[ordered_options.id=2,Ordered_Options.Value,null] as `Option2`,
  if[ordered_options.id=43,Ordered_Options.Value,null] as `Option43`,
  if[ordered_options.id=44,Ordered_Options.Value,null] as `Option44`,
  GROUP_CONCAT[if[ordered_options.id not in [1,2,43,44],Ordered_Options.Value,null]] as `OtherOptions`
from
  ordered_item,
  ordered_options
where
  ordered_item.id=ordered_options.ordered_item_id
group by
  ordered_item.id

Cái nào sẽ xuất hiện:Jul 1, 2009 at 11:55

Bằng cách đó, bạn có thể có bao nhiêu tùy chọn như bạn muốn mà không phải sửa đổi truy vấn của mình.

Select OI.ID, OI.Item_Name, OO1.Value, OO2.Value, OO3.Value, OO4.Value

FROM Ordered_Items OI
    LEFT JOIN Ordered_Options OO1 ON OO1.Ordered_Item_ID = OI.ID
    LEFT JOIN Ordered_Options OO2 ON OO2.Ordered_Item_ID = OI.ID AND OO2.ID != OO1.ID
    LEFT JOIN Ordered_Options OO3 ON OO3.Ordered_Item_ID = OI.ID AND OO3.ID != OO1.ID AND OO3.ID != OO2.ID
    LEFT JOIN Ordered_Options OO4 ON OO4.Ordered_Item_ID = OI.ID AND OO4.ID != OO1.ID AND OO4.ID != OO2.ID AND OO4.ID != OO3.ID

GROUP BY OI.ID, OI.Item_Name

À, nếu bạn thấy kết quả của mình bị cắt, bạn có thể tăng giới hạn kích thước của nhóm_concat như thế này:

Đã trả lời ngày 1 tháng 7 năm 2009 lúc 5:43Sep 16, 2009 at 20:22

Tôi đánh giá cao sự giúp đỡ, tôi nghĩ rằng tôi đã tìm ra một giải pháp nếu ai đó sẽ bình luận về hiệu quả mà tôi sẽ đánh giá cao nó. Về cơ bản những gì tôi đã làm là. Tôi nhận ra nó có phần tĩnh trong việc thực hiện nhưng tôi làm những gì tôi cần nó để làm [tha thứ cho cú pháp không chính xác]

Ordered_Item_ID | Option_Number | Value
        1               43         Pepperoni
        1               44         Extra Cheese
        2               44         Extra Cheese
0

Đã trả lời ngày 1 tháng 7 năm 2009 lúc 6:59

Nếu bạn thực sự cần nhiều cột trong kết quả của mình và số lượng tùy chọn bị hạn chế, bạn thậm chí có thể làm điều này:Jun 1, 2017 at 4:37

Đã trả lời ngày 1 tháng 7 năm 2009 lúc 11:55

Nếu bạn biết bạn sẽ có một số tùy chọn tối đa giới hạn thì tôi sẽ thử điều này [ví dụ cho tối đa 4 tùy chọn cho mỗi đơn hàng]:

Nhóm theo điều kiện được loại bỏ tất cả các bản sao mà bạn sẽ nhận được. Tôi vừa triển khai một cái gì đó tương tự trên một trang web tôi đang làm việc ở nơi tôi biết tôi luôn có 1 hoặc 2 khớp trong bảng con của tôi và tôi muốn chắc chắn rằng tôi chỉ có 1 hàng cho mỗi mục cha mẹ.

Đã trả lời ngày 16 tháng 9 năm 2009 lúc 20:22Oct 24, 2019 at 14:14

Đây là cách bạn sẽ xây dựng truy vấn của bạn cho loại yêu cầu này.hailong

Về cơ bản, bạn "Out" mỗi cột bằng cách sử dụng

Ordered_Item_ID | Option_Number | Value
        1               43         Pepperoni
        1               44         Extra Cheese
        2               44         Extra Cheese
1, sau đó chọn
Ordered_Item_ID | Option_Number | Value
        1               43         Pepperoni
        1               44         Extra Cheese
        2               44         Extra Cheese
2 cho mỗi cột đó bằng cách sử dụng
Ordered_Item_ID | Option_Number | Value
        1               43         Pepperoni
        1               44         Extra Cheese
        2               44         Extra Cheese
3 cho mỗi mục dự định.14 silver badges18 bronze badges

Làm cách nào để cập nhật nhiều hàng của một cột trong MySQL?

Có một vài cách để làm điều đó.Chèn vào các giá trị của học sinh [ID, SCORE1, SCORE2] [1, 5, 8], [2, 10, 8], [3, 8, 3], [4, 10, 7] trên bản cập nhật khóa trùng lặp điểm 1 = giá trị [giá trị [điểm1], điểm2 = giá trị [điểm2];INSERT INTO students [id, score1, score2] VALUES [1, 5, 8], [2, 10, 8], [3, 8, 3], [4, 10, 7] ON DUPLICATE KEY UPDATE score1 = VALUES[score1], score2 = VALUES[score2];

Pivot trong MySQL là gì?

Xoay dữ liệu là một vấn đề khá phổ biến có nhiều hương vị khác nhau.Tại trung tâm của nó, yêu cầu là chuyển dữ liệu từ nhiều hàng sang các cột của một hàng.Yêu cầu này là đặc biệt phổ biến trong bối cảnh báo cáo.transpose data from multiple rows into columns of a single row. This requirement is particularity common in a reporting context.

Bài Viết Liên Quan

Chủ Đề