比较int字段和另一个表的逗号分隔字段

plupiseo  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(374)

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    |

由于计划表中的计划id是整数,并且用户可以持有许多计划,因此它以逗号分隔的形式存储为varchar,因此当我在条件中尝试时,它不起作用。

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

这使我从计划表中得到3行,但我希望得到如上所述的所需输出。
怎么做。?需要帮忙吗

iezvtpos

iezvtpos1#

重写你的查询应该做什么如下。。
查询

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_SETON a条款 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 .

相关问题