MYSQL从字段在字段中的表中选择

时间:2013-03-04 06:27:46

标签: mysql sql

已更新

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

的行

如何查询这些人?

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

Fiddle with IN()

使用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

Fiddle with FIND_IN_SET()

使用UNION ALL

select * from atable 
where id =1
UNION ALL 
select * from atable 
where 1 IN (id_list)

Fiddle with UNION ALL

答案 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