Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用逻辑操作获取数据列表的MySQL查询_Java_Php_Mysql - Fatal编程技术网

Java 使用逻辑操作获取数据列表的MySQL查询

Java 使用逻辑操作获取数据列表的MySQL查询,java,php,mysql,Java,Php,Mysql,以下是客户在图书馆阅读的各种书籍的列表。这些值以2的幂存储在名为bookType的列中 我需要取一份有阅读者组合的书单 仅小说或仅童话或仅睡前或两者都是小说+童话 从数据库中进行逻辑操作查询 获取以下组合的列表: 仅阅读小说的人(以1的形式存储在DB中) 同时阅读小说和童话故事的人(以1+2=3的形式存储在DB中) 阅读所有这三本书的人,即{小说+童话故事+睡觉时间}(存储在DB中为1+2+4=7) 它们的计数存储在数据库中一个名为BookType的列中(图中用红色标记) 如何使用MySQ

以下是客户在图书馆阅读的各种书籍的列表。这些值以2的幂存储在名为bookType的列中

我需要取一份有阅读者组合的书单
仅小说或仅童话或仅睡前或两者都是小说+童话
从数据库中进行逻辑操作查询

获取以下组合的列表:

  • 仅阅读小说的人(以1的形式存储在DB中)
  • 同时阅读小说和童话故事的人(以1+2=3的形式存储在DB中)
  • 阅读所有这三本书的人,即{小说+童话故事+睡觉时间}(存储在DB中为1+2+4=7)
它们的计数存储在数据库中一个名为BookType的列中(图中用红色标记)

如何使用MySQL查询获取上述列表


从这个例子中,我需要获取像小说阅读器(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)