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 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的用户的主要内容,如果未能解决你的问题,请参考以下文章