2016-05-03 5 views
0

У меня есть столбец manage в моей таблице user, которая содержит строку '2','3','4','5','6', эти цифры ссылаются на user.id, что пользователь «управляет».select statement in select

Постулаты:

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

Вопрос:Почему не мое заявление возвращения ничего?

+0

Можете ли вы предоставить схему для 'user' (даже если это просто идентификатор и управление)? Похоже, что 'manage' является строковым столбцом, который содержит« 2,3,4,5,6 ». – joncloud

+1

Поскольку пользователь 'id', который является целым числом, например' 2', не равен строкам ''' '2', '3', '4', '5', '6'" '. – zerkms

+0

@ joncloud yea именно 'manage' - это просто строка, содержащая' id', которую пользователь управляет (роль системы) –

ответ

3

Вы можете создать новую таблицу user_manages, которая содержит два столбца: manager_id и user_id. Создайте новую запись в таблице для каждого пользователя, управляющего менеджером. Затем вы можете создать соединение между двумя таблицами.

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

in работы по списках значений, а не одно значение строки. Итак, если у вас есть такая ценность val in ('1,2,3') является asme как val = '1,2,3'.

Сохранение нескольких значений в одном столбце плохая идея по многим причинам:

  • строковые функции MySQL, не особенно сильны.
  • Целые числа должны храниться как числа, а не строки.
  • Столбец должен содержать только одно значение.
  • Внешние отношения должны быть правильно определены.
  • Запросы с использованием столбца «список в строке» не могут использовать индексы.

Правильное решение представляет собой отдельную таблицу, называемую соединительной таблицей.

Иногда, увы, мы придерживаемся плохих проектных решений других людей.

Если да, то вы можете использовать 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(), чтобы получить строку в нужном формате.

+0

Было бы просто предложить 'find_in_set' – Jhecht