0

更新

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_list of id=1 中的所有行加上 id=1 的行

所以结果将是 id = 1,2,3,5,7 的行

请问各位大佬,这个查询怎么办?

4

7 回答 7

1

您也可以使用自加入

使用IN()

select * from atable a
join atable b on (a.id = b.id )
where 1 IN (a.id_list) or   b.id =1

摆弄 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

摆弄 FIND_IN_SET()

使用UNION ALL

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

摆弄 UNION ALL

于 2013-12-25T13:39:30.673 回答
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 测试

于 2013-03-04T06:56:46.927 回答
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,你会得到一个不正确的匹配

于 2013-03-04T06:57:57.790 回答
0

试试这个

select * 
from tbl 
where id=1 
or id_list like '%1%'
于 2013-10-14T04:16:03.453 回答
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

您可以在 SQL Fiddle尝试完整的查询。

请注意,列表不是一个很好的设计功能。在您的情况下,最好使用@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

这也是另一种方法的演示(所有三种变体,包括SELECT @id AS id一个)。

于 2013-10-14T08:22:05.593 回答
-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
于 2013-03-04T07:07:01.667 回答
-1

我假设您正在使用 php..
我的建议是获取 id 1
的 id_list。在逗号上分解该 id_list,然后执行另一个 mysql 查询以获取 5|3|6|8
ex) $idarray的剩余结果= 爆炸(",", $result);
select * from your_table where id in ('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。

于 2013-03-04T06:33:00.457 回答