Mysql - Сравнить поле int с полем, разделенным запятыми, из другой таблицы

0

У меня есть две таблицы в базе данных MySQL:

Пользователь:

userid     |userid      | Username     | Plan(VARCHAR) | Status  |
-----------+------------+--------------+---------------+---------+
1          | 1          |  John        | 1,2,3         |1        |
2          | 2          |  Cynthia     | 1,2           |1        |
3          | 3          |  Charles     | 2,3,4         |1        |

План: (planid - первичный ключ)

planid(INT)  |  Plan_Name     | Cost     |  status      | 
-------------+----------------+----------+--------------+
1            |  Tamil Pack    |  100     |  ACTIVE      |
2            |  English Pack  |  100     |  ACTIVE      |
3            |  SportsPack    |  100     |  ACTIVE      |
4            |  KidsPack      |  100     |  ACTIVE      |

ВЫХОД

id |userid | Username | Plan       | Planname                            |
---+-------+----------+------------+-------------------------------------+
1  | 1     |  John    | 1,2,3      |Tamil Pack,English Pack,SportsPack   |
2  | 2     |  Cynthia | 1,2        |Tamil Pack,English Pack              |
3  | 3     |  Charles | 2,3,4      |English Pack,Sportspack, Kidspack    |

Так как идентификатор плана в таблице Plan является целым числом, и пользователь может хранить много планов, его хранится как запятая, разделенная как varchar, поэтому, когда я пытаюсь с условием IN, это не работает.

SELECT * FROM plan WHERE find_in_set(plan_id,(select user.planid from user where user.userid=1))

Это даст мне 3 строки из таблицы плана, но я хочу получить желаемый результат, как указано выше.

Как это сделать.? любая помощь Пожалуйста

  • 1
    «Поскольку идентификатор плана в таблице планов является целым числом, и пользователь может хранить много планов, он хранится в виде запятой, разделенной как varchar, поэтому, когда я пытаюсь выполнить условие IN, оно не работает.» Если это новый проект, следует остановить значения, разделенные запятыми User_Plan и нормализовать структуру таблиц и добавить таблицу User_Plan которая содержит отношения.
  • 0
    Пожалуйста, прочитайте мой ответ на этот вопрос: действительно ли плохо хранить список с разделителями в столбце базы данных?
Теги:

1 ответ

0

Измените свой запрос, что должно работать следующим образом.

запрос

SELECT
   all columns you need
 , GROUP_CONCAT(Plan.Plan_Name ORDER BY Plan.planid) AS Planname
FROM
  Plan
WHERE
  FIND_IN_SET(Plan.plan_id,(
    SELECT
      User.Plan
    FROM
      user
    WHERE User.userid = 1
  )
)
GROUP BY
  all columns what are in the select (NOT the GROUP_CONCAT function)

Вы также можете использовать FIND_IN_SET в предложении ON с INNER JOIN. Одна из проблем заключается в том, что объединение никогда не будет использовать индексы.

запрос

SELECT 
   all columns you need
 , GROUP_CONCAT(Plan.Plan_Name ORDER BY Plan.planid) AS Planname
FROM 
 User 
INNER JOIN 
 Plan
ON
 FIND_IN_SET(Plan.id, User.Plan)
WHERE 
 User.id = 1
GROUP BY
 all columns what are in the select (NOT the GROUP_CONCAT function)

Как я уже сказал в комментариях, вы должны нормализовать структуры таблиц и добавить таблицу User_Plan содержатся отношения между таблицей User и Plan.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню