已更新
id | id_list
1 | 2,3,5,7
2 | 1,4,5,6
3 | 1,4,6,7
4 | 2,3,5,8
5 | 1,2,4,8
6 | 2,3,7,8
7 | 1,3,6,9
8 | 4,5,6,9
9 | 7,8
让我说我的内容是id = 1
我想选择ID为id = 1的所有行id = 1 PLUS id = 1的行
所以结果会是 id = 1,2,3,5,7
的行如何查询这些人?
答案 0 :(得分:1)
您也可以使用自我加入
使用IN()
select * from atable a
join atable b on (a.id = b.id )
where 1 IN (a.id_list) or b.id =1
使用FIND_IN_SET()
select * from atable a
join atable b on (a.id = b.id )
where FIND_IN_SET('1', a.id_list) or b.id =1
使用UNION ALL
select * from atable
where id =1
UNION ALL
select * from atable
where 1 IN (id_list)
答案 1 :(得分:0)
试试这个(见SQL-Fiddle):
SELECT * FROM tbl
WHERE id = 1
OR INSTR((SELECT id_list FROM tbl WHERE id = '1'), id) > 0;
使用MySQL 5.5.30进行测试
答案 2 :(得分:0)
您的数据库设计已损坏; id_list
应表示为连接表而不是字符串。但是,要解决您当前的问题:
select * from table where id=1
or id_list like '1%'
or id_list like '%,1,%'
or id_list like '%,1'
根据PreparedStatement
的需要进行调整。你必须提供所有三种情况,因为如果你刚刚做了
or id_list like '%1%'
且id_list
包含值11
,您收到的内容不正确
答案 3 :(得分:0)
尝试这个
select *
from tbl
where id=1
or id_list like '%1%'
答案 4 :(得分:0)
这似乎要求两套联合。一组将是id
匹配指定值的单行:
SELECT
id
FROM
atable
WHERE
id = @id
另一组是自我加入的结果:
SELECT
item.id
FROM
atable AS item
INNER JOIN
atable AS list
ON
FIND_IN_SET(item.id, list.id_list)
WHERE
list.id = @id
也就是说,具有指定id
的行与表中的每一行匹配,条件是在指定行的id
中找到另一行的id_list
。
您可以尝试完整的查询at SQL Fiddle。
请注意,列表不是一个很好的设计功能。在您的情况下,使用多对多表作为suggested by @Othman可能更好。只有我可能会使用稍微不同的查询来获得所需的输出,因为他不包含指定的行本身:
SELECT
id
FROM
manytomany
WHERE
id = @id
UNION
SELECT
linked_id
FROM
manytomany
WHERE
id = @id
;
虽然假设manytomany
中的条目是唯一的,但查询使用UNION DISTINCT运算符,因为第一个子查询可能会返回重复项,尽管可以将DISTINCT的应用程序移动到第一个子查询只有这样:
SELECT DISTINCT
id
FROM
manytomany
WHERE
id = @id
UNION ALL
SELECT
linked_id
FROM
manytomany
WHERE
id = @id
;
第一个子查询实际上可以简单地重写为SELECT @id AS id
,但重写只有在传递的值保证有效时才有意义,即它肯定会在manytomany.id
中找到。 / p>
Here's a demo也适用于其他方法(所有三种变体,包括SELECT @id AS id
一种)。
答案 5 :(得分:-1)
我假设你正在使用php ..
我的建议是获取id 1的id_list。
在逗号上分解id_list,然后执行另一个mysql查询以获取5 | 3 | 6 | 8的剩余结果
ex)$ idarray = explode(“,”,$ result);
从your_table中选择*,其中id为('5','3','6','8')
方案2:
SELECT * FROM your_table
WHERE id = '1'
OR id IN ('\''+(SELECT REPLACE(id_list,',','\',\'') FROM your_table WHERE id = '1')+'\'')
编辑:哎呀,抱歉,这应该是一个OR。
答案 6 :(得分:-1)
我对你的问题没有答案,但我鼓励你像这样重新设计你的桌子我认为这称为多对多关系
id | friend
1 | 2
1 | 3
1 | 5
1 | 7
2 | 1
2 | 4
2 | 5
2 | 6
3 | 1
3 | 4
3 | 6
3 | 7
然后你的查询就像这样
SELECT DISTINCT(friend) FROM `new` WHERE id = 1