select select 内的语句

select statement within select

我的 user table 中有一个 manage 列,其中包含一个字符串 '2','3','4','5','6',这些数字引用了用户的 user.id "manages".

声明:

SELECT * FROM user WHERE id IN(SELECT manage FROM user WHERE id = 1)

问题: 为什么我的语句没有返回任何内容?

您可以创建一个新的 table user_manages,其中包含两列:manager_iduser_id。在 table 中为经理管理的每个用户创建一条新记录。然后你可以在两个 table 之间建立连接。

SELECT user.* FROM user_manages
INNER JOIN user ON user.id = user_manages.user_id
WHERE user_manages.manager_id = 1

in 适用于 列表 个值,而不是单个字符串值。所以,如果你有这样的值 val in ('1,2,3') 就是 val = '1,2,3'.

在一个列中存储多个值不是一个好主意,原因有很多:

  • MySQL的字符串函数不是特别强大
  • 整数应存储为数字,而不是字符串。
  • 一列只能包含一个值。
  • 应正确定义外键关系。
  • 使用 "list-in-a-string" 列的查询不能使用索引。

正确的解决方案是一个单独的 table,称为结点 table。

有时候,唉,我们会被其他人糟糕的设计决定所困。

如果是这样,你可以使用find_in_set():

SELECT u.*
FROM user u
WHERE EXISTS (SELECT 1 FROM user u2 WHERE u2.id = 1 AND find_in_set(u.id, u2.manage) > 0);

注意:这假设字符串是逗号分隔的,没有空格或引号。您可能需要使用 replace() 来获取格式正确的字符串。