2012-07-11 66 views
8

Tôi không mong đợi điều này quá khó, nhưng tôi đang cố gắng đặt biến người dùng trong MySQL để chứa một mảng giá trị. Tôi không có đầu mối làm thế nào để làm điều này vì vậy đã cố gắng làm một số nghiên cứu và đã khá ngạc nhiên khi tìm thấy không có câu trả lời. Tôi đã thử:cách đặt mảng dưới dạng biến người dùng mysql

SET @billable_types = ['client1','client2','client3']; 

Lý do hạnh phúc Tôi muốn sử dụng biến trong phát biểu sau về sau:

SELECT sum((time_to_sec(timediff(tlg.time_stop, tlg.time_start))/3600)) as billable_hours 
    from mod_tmlog_time_log tlg, mod_tmlog_task_list mttl 
    where date(tlg.time_start) >= @time_start 
      and date(tlg.time_stop) <= @time_stop 
      and mttl.type IN (@billable_types) 
      and tlg.task_id = mttl.id 
    group by start_date 
    order by start_date desc; 

Sẽ rất biết ơn sự giúp đỡ.


Nhanh chóng chuyển tiếp một thời gian, tôi đã kết thúc với giải pháp nhanh chóng và dơ bẩn sau đó không cho tôi sự linh hoạt của việc tái sử dụng các mảng khác trong các mã nhưng hey đó là một nhiệm vụ quản trị unchargeable vì vậy tôi don không muốn tốn thêm thời gian nữa.

SELECT WEEKDAY(tlg.time_start) AS day_of_week, date(tlg.time_start) as start_date, 
          sum((time_to_sec(timediff(tlg.time_stop, tlg.time_start))/3600)) as billable_hours 
        from mod_tmlog_time_log tlg, mod_tmlog_task_list mttl 
        where date(tlg.time_start) >= @time_start 
          and date(tlg.time_stop) <= @time_stop 
          and mttl.type IN ('c1','c2','c3') 
          and tlg.task_id = mttl.id 
        group by start_date 
        order by start_date desc; 

joostschouten dường như đã tìm thấy giải pháp thanh lịch nhất (chưa thử nghiệm bản thân) nhưng lần sau tôi viết thử thứ mà tôi sẽ nhớ để kiểm tra!

+2

không có thứ gì như mảng trong SQL - chỉ có các bộ. Thật không may, những gì bạn đang cố gắng không hoạt động - mysql sẽ thay thế @billtable_types với nội dung của "mảng" của bạn như là một chuỗi nguyên khối duy nhất, và không xem nó như là một loạt các giá trị phân cách bằng dấu phẩy riêng biệt. Hãy thử sử dụng hàm 'FIND_IN_SET()' thay cho toán tử 'IN'. –

Trả lời

11

Chỉ cần tìm thấy câu trả lời ở đây: How to cycle with an array in MySQL?

set @billable_types = 'client1,client2,client3'; 
select * from mttl where find_in_set(mttl.type, @billable_types); 
+1

từ khóa "trong" không tồn tại 'Mã lỗi: 1064 Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho cú pháp đúng để sử dụng gần 'in @billable_types) ' – Mindwin

0

Như Marc B đã đề cập, không có biến mảng trong MYSQL.

Các thay thế cho find_in_set giải pháp là sử dụng CHỌN với UNION để mô phỏng các mảng:

SELECT billable_type FROM (
    SELECT 'client1' AS billable_type UNION 
    SELECT 'client2' AS billable_type UNION 
    SELECT 'client3' AS billable_type) AS t 

Vì vậy, ý chí truy vấn của bạn trông như thế:

SELECT sum((time_to_sec(timediff(tlg.time_stop, tlg.time_start))/3600)) as billable_hours 
    from mod_tmlog_time_log tlg, mod_tmlog_task_list mttl 
    where date(tlg.time_start) >= @time_start 
      and date(tlg.time_stop) <= @time_stop 
      and mttl.type IN (

      SELECT billable_type FROM (
       SELECT 'client1' AS billable_type UNION 
       SELECT 'client2' AS billable_type UNION 
       SELECT 'client3' AS billable_type) AS t 

     ) 
      and tlg.task_id = mttl.id 
    group by start_date 
    order by start_date desc; 
+0

Khi chủ đề này đã nổi lên một lần nữa, tôi sẽ chỉnh sửa câu hỏi gốc của mình và thêm những gì tôi đã làm. –

0

Nếu người dùng có đặc quyền CREATE TABLE, một mảng có thể được mô phỏng bằng cách tạo bảng tạm thời, một cột. Giá trị hoặc giá trị trong bảng có thể được truy xuất bằng câu lệnh SELECT. Các bảng tạm thời bị loại bỏ vào cuối phiên, nhưng tốt nhất là thả chúng một cách rõ ràng khi chúng không còn cần thiết nữa.

CREATE TEMPORARY TABLE billable_types (c VARCHAR(16)); 
INSERT INTO billable_types VALUES ('client1'), ('client2'), ('client3'); 

SELECT sum((time_to_sec(timediff(tlg.time_stop, tlg.time_start))/3600)) as billable_hours 
from mod_tmlog_time_log tlg, mod_tmlog_task_list mttl 
where date(tlg.time_start) >= @time_start 
     and date(tlg.time_stop) <= @time_stop 
     and mttl.type IN (SELECT * FROM billable_types) 
     and tlg.task_id = mttl.id 
group by start_date 
order by start_date desc; 

DROP TABLE billable_types; 
Các vấn đề liên quan