Java 使用逻辑操作获取数据列表的MySQL查询
以下是客户在图书馆阅读的各种书籍的列表。这些值以2的幂存储在名为bookType的列中 我需要取一份有阅读者组合的书单Java 使用逻辑操作获取数据列表的MySQL查询,java,php,mysql,Java,Php,Mysql,以下是客户在图书馆阅读的各种书籍的列表。这些值以2的幂存储在名为bookType的列中 我需要取一份有阅读者组合的书单 仅小说或仅童话或仅睡前或两者都是小说+童话 从数据库中进行逻辑操作查询 获取以下组合的列表: 仅阅读小说的人(以1的形式存储在DB中) 同时阅读小说和童话故事的人(以1+2=3的形式存储在DB中) 阅读所有这三本书的人,即{小说+童话故事+睡觉时间}(存储在DB中为1+2+4=7) 它们的计数存储在数据库中一个名为BookType的列中(图中用红色标记) 如何使用MySQ
仅小说或仅童话或仅睡前或两者都是小说+童话
从数据库中进行逻辑操作查询
获取以下组合的列表:
- 仅阅读小说的人(以1的形式存储在DB中)
- 同时阅读小说和童话故事的人(以1+2=3的形式存储在DB中)
- 阅读所有这三本书的人,即{小说+童话故事+睡觉时间}(存储在DB中为1+2+4=7)
从这个例子中,我需要获取像小说阅读器(1,3,5,7)这样的用户。这个问题的核心是十进制到二进制的转换,mysql有一个函数来执行just-CONV(num,From_base,to_base); 在这种情况下,from_base为10,to_base为2。 我会用UDF来包装这个 如此给定 注意UDF中遍历二进制字符串的循环,1的位置与查找表中的ID相关;
我把错误的编码和整理留给你 我将首先研究枚举和集合,甚至是连接表。MySQL有更好的存储此类信息的方法。从示例中,我需要获取像小说阅读器(1,3,7)这样的片段。您能解释一下这对我有什么帮助吗?您可以在select的where子句中使用find_in_set('novel',book_type(u.id))@鲁比,你看到我最近的评论了吗?
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)
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 ;
+----+----------+---------------------------+
| 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)