Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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
Mysql SQL数组搜索_Mysql_Sql - Fatal编程技术网

Mysql SQL数组搜索

Mysql SQL数组搜索,mysql,sql,Mysql,Sql,我的网站上有一个群组功能,允许一个用户将他或她的任何朋友的用户名放入一个invitedusers列。我需要进行SQL搜索,以确定登录用户的ID是否已被其朋友存储在任何invitedusers列中。 如何使用sql搜索实现这一点 例如:我的列是invitedusers,在该列中存储了以下内容234394479 当userid234登录后,我需要搜索查看是否有任何列在invitedusers列中存储了userid234 SELECT userid, name... FROM mytable WHER

我的网站上有一个群组功能,允许一个用户将他或她的任何朋友的用户名放入一个invitedusers列。我需要进行SQL搜索,以确定登录用户的ID是否已被其朋友存储在任何invitedusers列中。 如何使用sql搜索实现这一点

例如:我的列是invitedusers,在该列中存储了以下内容234394479 当userid234登录后,我需要搜索查看是否有任何列在invitedusers列中存储了userid234

SELECT userid, name... FROM mytable WHERE invitedusers = ?

*我查看了SQL IN运算符和FIND_IN_SET,但两者都没有帮助。*

您可能不想在列中存储逗号分隔的列表,但因为您:

SELECT userid, name FROM mytable
WHERE invitedusers = '(' + '234' + ')' -- One and only one entry
OR invitedusers LIKE '(' + '234' + ',%' -- First entry
OR invitedusers LIKE '%,' + '234' + ',%' -- Middle entry
OR invitedusers LIKE '%,' + '234' + ')%' -- Last entry
我根据埃巴尔的评论进行了修改。有四个病例需要检查。这假设您使用前缀和后缀存储数据,并使用逗号分隔所有内容

以下是一些测试,以证明它是有效的:

/* Tests */
INSERT INTO @mytable SELECT 11, 'a', '(234)' -- Should get returned
INSERT INTO @mytable SELECT 12, 'b', '(1234)'
INSERT INTO @mytable SELECT 13, 'c', '(92349)'
INSERT INTO @mytable SELECT 13, 'd', '(2345)'

INSERT INTO @mytable SELECT 21, 'a', '(234,567)' -- Should get returned
INSERT INTO @mytable SELECT 22, 'b', '(1234,567)'
INSERT INTO @mytable SELECT 23, 'c', '(92349,567)'
INSERT INTO @mytable SELECT 23, 'd', '(2345,567)'

INSERT INTO @mytable SELECT 31, 'a', '(567,234)' -- Should get returned
INSERT INTO @mytable SELECT 32, 'b', '(567,1234)'
INSERT INTO @mytable SELECT 33, 'c', '(567,92349)'
INSERT INTO @mytable SELECT 33, 'd', '(567,2345)'

INSERT INTO @mytable SELECT 41, 'a', '(123,234,789)' -- Should get returned
INSERT INTO @mytable SELECT 42, 'b', '(123,1234,789)'
INSERT INTO @mytable SELECT 43, 'c', '(123,92349,789)'
INSERT INTO @mytable SELECT 43, 'd', '(123,2345,789)'

SELECT userid, name FROM @mytable
WHERE invitedusers = '(' + '234' + ')' -- One and only one entry
OR invitedusers LIKE '(' + '234' + ',%' -- First entry
OR invitedusers LIKE '%,' + '234' + ',%' -- Middle entry
OR invitedusers LIKE '%,' + '234' + ')%' -- Last entry

您可能不希望在列中存储逗号分隔的列表,但因为您:

SELECT userid, name FROM mytable
WHERE invitedusers = '(' + '234' + ')' -- One and only one entry
OR invitedusers LIKE '(' + '234' + ',%' -- First entry
OR invitedusers LIKE '%,' + '234' + ',%' -- Middle entry
OR invitedusers LIKE '%,' + '234' + ')%' -- Last entry
我根据埃巴尔的评论进行了修改。有四个病例需要检查。这假设您使用前缀和后缀存储数据,并使用逗号分隔所有内容

以下是一些测试,以证明它是有效的:

/* Tests */
INSERT INTO @mytable SELECT 11, 'a', '(234)' -- Should get returned
INSERT INTO @mytable SELECT 12, 'b', '(1234)'
INSERT INTO @mytable SELECT 13, 'c', '(92349)'
INSERT INTO @mytable SELECT 13, 'd', '(2345)'

INSERT INTO @mytable SELECT 21, 'a', '(234,567)' -- Should get returned
INSERT INTO @mytable SELECT 22, 'b', '(1234,567)'
INSERT INTO @mytable SELECT 23, 'c', '(92349,567)'
INSERT INTO @mytable SELECT 23, 'd', '(2345,567)'

INSERT INTO @mytable SELECT 31, 'a', '(567,234)' -- Should get returned
INSERT INTO @mytable SELECT 32, 'b', '(567,1234)'
INSERT INTO @mytable SELECT 33, 'c', '(567,92349)'
INSERT INTO @mytable SELECT 33, 'd', '(567,2345)'

INSERT INTO @mytable SELECT 41, 'a', '(123,234,789)' -- Should get returned
INSERT INTO @mytable SELECT 42, 'b', '(123,1234,789)'
INSERT INTO @mytable SELECT 43, 'c', '(123,92349,789)'
INSERT INTO @mytable SELECT 43, 'd', '(123,2345,789)'

SELECT userid, name FROM @mytable
WHERE invitedusers = '(' + '234' + ')' -- One and only one entry
OR invitedusers LIKE '(' + '234' + ',%' -- First entry
OR invitedusers LIKE '%,' + '234' + ',%' -- Middle entry
OR invitedusers LIKE '%,' + '234' + ')%' -- Last entry

我不确定这是否是最好的方式,但是:

where concat(',',invitedusers,',') like '%,234,%'

因此,在您的示例中,234位于内部,234394479,

我不确定这是否是最好的方法,但是:

where concat(',',invitedusers,',') like '%,234,%'

因此,在您的示例中,234位于234394479中,

假设您确实使用234394479作为一列的值,您至少应该使用234394479,以便能够在查询中执行受邀请的操作,如“%”,234,%”,您应该重建用户表,删除字段invested\u users,并创建如下表:

创建表用户 id INT自动增量, 所有者\u id INT,-是谁输入的 target_id INT,-目标用户是什么 主键id, 唯一所有者id、目标id、, -索引外键!到用户表 ; 而不仅仅是通过查询选择邀请用户234的用户列表:

选择users.id、users.name 来自受邀用户 邀请的内部加入用户\u users.owner\u id=users.id 按用户分组。id 其中邀请的用户。目标用户id=234
假设您真的使用234394479作为一列的值,您至少应该使用234394479,以便能够在查询中执行受邀请的操作,如“%”、234、%”,您应该重建用户表,删除字段“受邀请的用户”,并创建如下表:

创建表用户 id INT自动增量, 所有者\u id INT,-是谁输入的 target_id INT,-目标用户是什么 主键id, 唯一所有者id、目标id、, -索引外键!到用户表 ; 而不仅仅是通过查询选择邀请用户234的用户列表:

选择users.id、users.name 来自受邀用户 邀请的内部加入用户\u users.owner\u id=users.id 按用户分组。id 其中邀请的用户。目标用户id=234
这应该可以做到:

SELECT userid, name... FROM mytable WHERE FIND_IN_SET('234', invitedusers) !=0;

这应该可以做到:

SELECT userid, name... FROM mytable WHERE FIND_IN_SET('234', invitedusers) !=0;

我想你在找我。如中所示,选择userid、name。。。在mytable中,像“%234%”这样的受邀者恐怕没有表架构示例我们就帮不了你。为什么人们总是想办法绕过糟糕的数据库设计,而不是一开始就设计干净规范化的表?想必你是在表中存储所有这些邀请之类的内容,所以你需要做点什么加入。我想你在寻找喜欢的人。如中所示,选择userid、name。。。在mytable中,像“%234%”这样的受邀者恐怕没有表架构示例我们就帮不了你。为什么人们总是想办法绕过糟糕的数据库设计,而不是一开始就设计干净规范化的表?想必你是在表中存储所有这些邀请之类的内容,因此,您需要进行某种类型的联接。您需要将分隔符添加到您的相似条件中。如前所述,您将匹配234、1234、92349和2345的条目。逗号分隔列表的更好解决方案是什么?创建一个与父表具有一对多关系的子表。然后您的查询会变成这样:从mytable a中选择a.userid,a.name左外连接mychildtable b在a.userid=b.userid其中b.invitedusers=234Wow,谢谢!这样做了,但似乎我必须重新设计我的结构。您需要将分隔符添加到类似的条件中。如前所述,您将匹配234、1234、92349和2345的条目。逗号分隔列表的更好解决方案是什么?创建一个与父表具有一对多关系的子表。然后您的查询会变成这样:从mytable a中选择a.userid,a.name左外连接mychildtable b在a.userid=b.userid其中b.invitedusers=234Wow,谢谢!这确实做到了,但似乎我必须重新设计我的结构。非常感谢这个Vyktor。绝对要实现它。非常感谢这个Vyktor。一定要实施。