Sql 如何选择具有相同值的ID?
我有一个包含UserID和他们的书的表。是这样的:Sql 如何选择具有相同值的ID?,sql,Sql,我有一个包含UserID和他们的书的表。是这样的: |UserID|Books| -------------- | a | a | -------------- | b | a | -------------- | b | b | -------------- | c | a | -------------- | c | b | -------------- | c | c | -------------- 我想获得与其
|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的书可能是可变的。我该怎么做?