Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Sql 如何选择具有相同值的ID?_Sql - Fatal编程技术网

Sql 如何选择具有相同值的ID?

Sql 如何选择具有相同值的ID?,sql,Sql,我有一个包含UserID和他们的书的表。是这样的: |UserID|Books| -------------- | a | a | -------------- | b | a | -------------- | b | b | -------------- | c | a | -------------- | c | b | -------------- | c | c | -------------- 我想获得与其

我有一个包含UserID和他们的书的表。是这样的:

|UserID|Books|
--------------
|   a  |  a  |
--------------
|   b  |  a  |
--------------
|   b  |  b  |
--------------       
|   c  |  a  |
--------------
|   c  |  b  |
--------------
|   c  |  c  |
--------------
我想获得与其他人拥有相同书籍的用户ID


对于这张桌子,我想要一张。什么是用于此的SQL命令?

下面的命令如何?它依赖于使用&&for数组求交,我希望它对您有用

with data_table as (
select user_id, array_agg(books) book_group -- this groups books for every user
from
(select -- this recreates your data
   unnest(array['a', 'b', 'b', 'c', 'c', 'c']) user_id,
   unnest(array['a', 'a', 'b', 'a' ,'b', 'c']) books) a
group by 1)

select data_table.user_id, data_table.book_group,
  data_table_other.user_id user_id_other,
  data_table.book_group && data_table_other.book_group and -- this checks intersection between book groups
  data_table.user_id != data_table_other.user_id is_book_shared
from data_table
left join data_table data_table_other
on True
order by 1, 3
输出:

    user_id book_group      user_id_other   is_book_shared
0   a       ['a']           a               False
1   a       ['a']           b               True
2   a       ['a']           c               True
3   b       ['a', 'b']      a               True
4   b       ['a', 'b']      b               False
5   b       ['a', 'b']      c               True
6   c       ['a', 'b', 'c'] a               True
7   c       ['a', 'b', 'c'] b               True
8   c       ['a', 'b', 'c'] c               False

下面的怎么样?它依赖于使用&&for数组求交,我希望它对您有用

with data_table as (
select user_id, array_agg(books) book_group -- this groups books for every user
from
(select -- this recreates your data
   unnest(array['a', 'b', 'b', 'c', 'c', 'c']) user_id,
   unnest(array['a', 'a', 'b', 'a' ,'b', 'c']) books) a
group by 1)

select data_table.user_id, data_table.book_group,
  data_table_other.user_id user_id_other,
  data_table.book_group && data_table_other.book_group and -- this checks intersection between book groups
  data_table.user_id != data_table_other.user_id is_book_shared
from data_table
left join data_table data_table_other
on True
order by 1, 3
输出:

    user_id book_group      user_id_other   is_book_shared
0   a       ['a']           a               False
1   a       ['a']           b               True
2   a       ['a']           c               True
3   b       ['a', 'b']      a               True
4   b       ['a', 'b']      b               False
5   b       ['a', 'b']      c               True
6   c       ['a', 'b', 'c'] a               True
7   c       ['a', 'b', 'c'] b               True
8   c       ['a', 'b', 'c'] c               False

您可以检查每一行,查看是否有其他行具有不同的用户,但具有相同的书本:

select books, userid
from user_book as ub1
where 0 < (select count(*) 
           from user_book as ub2
           where ub2.userid <> ub1.userid
           and   ub2.books = ub1.books )
示例代码:

但是,我觉得你的问题很模糊,这可能不是你真正想要的,所以如果有必要,请澄清

--编辑--

为了更好地满足更改后的要求:

select distinct userid
from user_book as ub1
where userid <> 'a'
and books in (
           select books 
           from user_book as ub2
           where ub2.userid = 'a' )

此处的工作示例:

您可以检查每一行,查看是否有其他行具有不同的用户,但具有相同的书籍:

select books, userid
from user_book as ub1
where 0 < (select count(*) 
           from user_book as ub2
           where ub2.userid <> ub1.userid
           and   ub2.books = ub1.books )
示例代码:

但是,我觉得你的问题很模糊,这可能不是你真正想要的,所以如果有必要,请澄清

--编辑--

为了更好地满足更改后的要求:

select distinct userid
from user_book as ub1
where userid <> 'a'
and books in (
           select books 
           from user_book as ub2
           where ub2.userid = 'a' )

这里的工作示例:

如果需要所有几乎匹配的记录,则可以使用Like

select distinct UserID from table where Books like 'a%'

如果需要所有几乎匹配的记录,则可以使用Like

select distinct UserID from table where Books like 'a%'

这真的很简单。阅读[mysqltutorial.org]mysqltutorial.org上的文章,添加您尝试的代码。我删除了不兼容的数据库标记。这非常简单。阅读[mysqltutorial.org]mysqltutorial.org上的文章,添加您尝试过的代码。我删除了不兼容的数据库标记。太复杂了,什么都没有。非常感谢您的帮助。你是对的。实际的问题是列出User1拥有的书籍的userid。用户1来自决策。所以User1的书可能是可变的。我该怎么做?太复杂了,什么都做不了。非常感谢你的帮助。你是对的。实际的问题是列出User1拥有的书籍的userid。用户1来自决策。所以User1的书可能是可变的。我该怎么做呢?太复杂了,什么都没有。非常有建设性,让我们看看你的解决方案太复杂了,什么都没有。非常有建设性,让我们看看你的解决方案谢谢你的回答。真正的问题是列出User1拥有的书籍的userid。用户1来自决策。所以User1的书可能是可变的。我该怎么做?谢谢你的回答。真正的问题是列出User1拥有的书籍的userid。用户1来自决策。所以User1的书可能是可变的。我该怎么做?谢谢你的回答。真正的问题是列出User1拥有的书籍的userid。用户1来自决策。所以User1的书可能是可变的。我该怎么做?谢谢你的回答。真正的问题是列出User1拥有的书籍的userid。用户1来自决策。所以User1的书可能是可变的。我该怎么做?