2012-11-08 38 views
9

xin vui lòng, đừng để tôi đi loco. Tôi đã dành hàng giờ cố gắng tìm một câu trả lời cho nhiệm vụ dường như dễ dàng này.Chuyển đổi động chuỗi thành tên cột. MySQL

Vì vậy, chúng ta có hai bảng: các mặt hàng và đơn đặt hàng

items 
-------------- 
id (int) | type_1 (int) | type_2 (int)| 

orders 
-------------- 
id (int) | transaction_type enum ('type_1', 'type_2') 

Về cơ bản, tôi muốn làm như sau:

select (select transaction_type from orders where id=1) from items; 

SO, vấn đề là chuỗi trả về bởi chọn giao dịch nào từ đơn đặt hàng nơi id = 1, không thể chuyển đổi thành tên cột. Ý tưởng? Cảm ơn, anh em.

+1

Lỗi bạn nhận được khi chạy truy vấn đó là gì? Tôi dường như nhận được phản hồi chính xác, nhưng tôi có thể hiểu sai câu hỏi :) – RocketDonkey

+0

@RocketDonkey nó trả về cho tôi số chuỗi 'type_1' (theo số hàng trong các mục) –

+0

OK, lỗi của tôi - đã đăng nội dung nào đó có thể được sử dụng (xin lỗi nếu tôi hiểu lầm một lần nữa). – RocketDonkey

Trả lời

0

vấn đề là chuỗi trả về bởi chọn giao dịch nào từ đơn đặt hàng nơi id = 1, không thể được chuyển đổi thành tên cột

Bạn phải PIVOT các giá trị của cột transaction_type của bảng orders như vậy:

SELECT 
     id, 
     MAX(CASE WHEN transaction_type = 'type_1' THEN 1 END) Type1, 
     MAX(CASE WHEN transaction_tyep = 'type_2' THEN 2 END) type2 
    FROM orders 
    GROUP BY id 

Sau đó, bạn có thể JOIN hai bảng như sau:

SELECT i.id - what do you want to select 
FROM items i 
INNER JOIN 
(
    SELECT 
     id, 
     MAX(CASE WHEN transaction_type = 'type_1' THEN 1 END) Type1, 
     MAX(CASE WHEN transaction_tyep = 'type_2' THEN 2 END) type2 
    FROM orders 
    GROUP BY id 
) o ON i.type_1 = o.type1 AND i.type_2 = o.type2 -- you can add more conditions 
6

Bạn có thể muốn xem câu trả lời cho this question, mà tôi tin là những gì bạn đang cố gắng hoàn thành. Tóm lại, câu trả lời gợi ý sử dụng các câu lệnh chuẩn bị để mô phỏng một hàm eval() - esque. Trong trường hợp của bạn, điều này có thể làm việc (bạn sẽ nhìn thấy SQLFiddle here:

SELECT transaction_type FROM orders WHERE id=1 into @colname; 
SET @table = 'items'; 
SET @query = CONCAT('SELECT ',@colname,' FROM ', @table); 

PREPARE stmt FROM @query; 
EXECUTE stmt; 

tôi sẽ không tự xưng là bất kỳ loại chuyên gia về cơ chế cơ bản tại nơi làm việc, nhưng theo ý kiến ​​có vẻ như để đạt được mục tiêu Một lần nữa, điều này đã được áp dụng từ một câu trả lời khác, vì vậy nếu nó hoạt động thì hãy đảm bảo +1 câu trả lời đó :)

Các vấn đề liên quan