2016-12-02 14 views
5

Sau đây là danh sách các loại sách khác nhau mà khách hàng đọc trong thư viện. Các giá trị được lưu trữ với sức mạnh của 2 trong một cột được gọi là bookType.Truy vấn MySQL để tìm nạp danh sách dữ liệu sử dụng phép toán logic

List of customer reading books

tôi cần phải lấy danh sách các cuốn sách với sự kết hợp của những người đọc only Novel Or only Fairytale Or only BedTime Or both Novel + Fairytale từ cơ sở dữ liệu với truy vấn hoạt động logic.

Fetch danh sách cho các kết hợp sau đây:

  • người đọc chỉ cuốn tiểu thuyết (Stored trong DB như 1)
  • người đọc cả cuốn tiểu thuyết và câu chuyện cổ tích (Stored trong DB như 1 + 2 = 3)
  • người đọc tất cả ba tức là {tiểu thuyết + fairy tale + thời gian giường} (lưu trữ trong DB như 1 + 2 + 4 = 7)

số đếm trong số này được lưu trữ trong các d atabase trong một cột gọi là BookType (được đánh dấu bằng màu đỏ trong hình.)

Làm thế nào tôi có thể lấy danh sách trên sử dụng MySQL truy vấn

Từ ví dụ này, tôi cần phải lấy người như đọc tiểu thuyết (1,3 , 5,7).

+1

Tôi sẽ bắt đầu bằng cách điều tra các enums và bộ - hoặc thậm chí các bảng nối. MySQL có nhiều cách lưu trữ tốt hơn loại thông tin này. –

Trả lời

1

Trung tâm của câu hỏi này là chuyển đổi thập phân sang nhị phân và mysql có chức năng để thực hiện chỉ - CONV (num, from_base, to_base); Trong trường hợp này from_base sẽ là 10 và to_base sẽ là 2. tôi sẽ quấn này trong một UDF Vì vậy, cho

MariaDB [sandbox]> select id,username 
    -> from users 
    -> where id < 8; 
+----+----------+ 
| id | username | 
+----+----------+ 
| 1 | John  | 
| 2 | Jane  | 
| 3 | Ali  | 
| 6 | Bruce | 
| 7 | Martha | 
+----+----------+ 
5 rows in set (0.00 sec) 

MariaDB [sandbox]> select * from t; 
+------+------------+ 
| id | type  | 
+------+------------+ 
| 1 | novel  | 
| 2 | fairy Tale | 
| 3 | bedtime | 
+------+------------+ 
3 rows in set (0.00 sec) 

UDF này

drop function if exists book_type; 
delimiter // 

CREATE DEFINER=`root`@`localhost` FUNCTION `book_type`(
    `indec` int 
) 
RETURNS varchar(255) CHARSET latin1 
LANGUAGE SQL 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT '' 
begin 
declare tempstring varchar(100); 
declare outstring varchar(100); 
declare book_types varchar(100); 
declare bin_position int; 
declare str_length int; 
declare checkit int; 
set tempstring = reverse(lpad(conv(indec,10,2),4,0)); 
set str_length = length(tempstring); 
set checkit = 0; 
set bin_position = 0; 
set book_types = ''; 
looper: while bin_position < str_length do 
     set bin_position = bin_position + 1; 
     set outstring = substr(tempstring,bin_position,1); 


     if outstring = 1 then 
      set book_types = concat(book_types,(select trim(type) from t where id = bin_position),','); 
     end if; 
end while; 

set outstring = book_types; 

return outstring; 
end // 
delimiter ; 

Kết quả trong

+----+----------+---------------------------+ 
| id | username | book_type(id)    | 
+----+----------+---------------------------+ 
| 1 | John  | novel,     | 
| 2 | Jane  | fairy Tale,    | 
| 3 | Ali  | novel,fairy Tale,   | 
| 6 | Bruce | fairy Tale,bedtime,  | 
| 7 | Martha | novel,fairy Tale,bedtime, | 
+----+----------+---------------------------+ 
5 rows in set (0.00 sec) 

Lưu ý vòng lặp trong UDF để đi qua chuỗi nhị phân và vị trí của 1 liên quan đến các id trong bảng tra cứu; Tôi để nó cho bạn để mã lỗi và dọn dẹp.

+0

Từ ví dụ này, tôi cần tìm nạp các phân đoạn như độc giả mới (1,3,7). Bạn có thể giải thích làm thế nào điều này sẽ giúp tôi? – r123

+0

Bạn có thể sử dụng find_in_set ('novel', book_type (u.id)) trong mệnh đề where của lựa chọn của bạn; –

+0

@ ruby ​​bạn có thấy nhận xét mới nhất của tôi không? –

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