sql 查询具有相同tag的用户

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 查询具有相同tag的用户相关的知识,希望对你有一定的参考价值。

表user如下:
userid username tag
1 小王 iphone,football,movie
2 小李 football,music
3 小张 basketball

如上用户表,tag列表示用户的标签,要求查与我相关的用户,相关的条件就是有一个以上相同的tag,上表中小王和小李就是相关用户,如何写查询语句?
我的平台是在php+mysql环境下

以下在 SQL 2008 Express 版本下通过。
理论上 SQL 2005 版本也可以。

CREATE TABLE #user (
userid INT,
username VARCHAR(10),
tag VARCHAR(50)
);
GO

INSERT INTO #user
SELECT 1, \'小王\', \'iphone,football,movie\' UNION ALL
SELECT 2, \'小李\', \'football,music\' UNION ALL
SELECT 3, \'小张\', \'basketball\'
GO

SET QUOTED_IDENTIFIER ON
go

WITH myCTE AS
(
select
a.userid,
a.username,
b.OneTag
from
(
select
userid,
username,
allTag = convert(xml, \'<root><v>\' + replace(tag,\',\',\'</v><v>\') + \'</v></root>\')
from
#user
)a
outer apply
(
select
OneTag = C.v.value(\'.\', \'nvarchar(100)\')
from
a.allTag.nodes(\'/root/v\')C(v)
) b
)
SELECT
firstUser.userid AS [用户ID],
firstUser.username AS [用户名],
secondUser.userid AS [相关用户ID],
secondUser.username AS [相关用户名],
firstUser.OneTag AS [相关Tag]
FROM
myCTE firstUser
JOIN myCTE secondUser
ON(firstUser.userid < secondUser.userid
AND firstUser.OneTag = secondUser.OneTag)

执行结果:
用户ID 用户名 相关用户ID 相关用户名 相关Tag
1 小王 2 小李 football追问

谢谢,我的环境是PHP+MYSQL, 这个原理好像是转化成XML, 不知道能不能调试,先试一下

追答

上面的 SQL 语句, MYSQL 不支持的。可能要用别的方式来处理了。

参考技术A select from user where tag='%xxx%‘ 参考技术B select username from test where tag like '%football%'追问

这个条件是已知的,假如我要随变拿一个用户出来,找出与他有一个以上相同的tag的用户怎么查?

追答

取出这个用户的tag值

参考技术C 如果你的TAG分开来(比如TAG1 iphone TAG2 football TAG3 movie)用内连接就好办了,但是你这么合起来的话会很麻烦的。。追问

分开设计的话,每一个tag就是一条记录,tag表就会很大了,这样不能实现吗?

追答

在我的知识范围内。。实现不了~~真的不好意思。。

参考技术D select * from user u1 where u1.tag like (select tag from user u2 where u2.username!='小王') 第5个回答  2011-07-06 查询结果这样写 select id,right(tag,(len(tag)-charindex('>',tag))) new_tag from 表名
更新记录这样写 update 表名 set teg=right(tag,(len(tag)-charindex('>',tag))) from 表名

SQL 查询以查找具有相同列值的多行

【中文标题】SQL 查询以查找具有相同列值的多行【英文标题】:SQL Query to Find Multiple Rows with Same Column Value 【发布时间】:2016-05-21 16:42:18 【问题描述】:

我有一个用户表,其中有一列称为电子邮件,一列称为启用。我正在寻找具有相同电子邮件的所有用户。如果其中一个用户已启用为零,我想将该用户的登录名重置为其名字(另一列)。注意:最多应该有两个用户共享一个电子邮件。

我刚刚开始学习 SQL。我怎样才能让这个查询工作?感谢您的耐心!

update users
set users.login = users.first_name
from users u1 inner join users u2
on u1.email = u2.email 
  where u1.id != u2.id
  and u2.enabled is null

我的 RDBMS 是 MySQL!

【问题讨论】:

您的 RDBM 是什么?在大多数情况下,更新命令可能会有所不同。 伟大的呼吁 - 它的 MySQL 【参考方案1】:

如果您使用的是MySQL,那么;

update users u1 
join users u2 on
u1.email = u2.email and u1.enable is null
set u1.login = u1.first_name

sql fiddle demo

【讨论】:

以上是关于sql 查询具有相同tag的用户的主要内容,如果未能解决你的问题,请参考以下文章

避免针对具有不同注释的相同查询的计划缓存膨胀

SQL,查找两个给定名称在一列中是不是具有相同数字的查询

F# 查询表达式是不是具有与本机 SQL 相同的性能?

使用 SQL 和 Sqlalchemy 查询的表具有相同的列名

如何编写 SQL 查询以获取具有相同前缀的行

两个 SQL 查询具有相同的结果,但一个速度要快一个数量级