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 Cheese0
Đã 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