按逗号分隔值排序

时间:2019-01-04 13:02:24

标签: php mysql sql mysqli

我有两个表body_part和video_customized。

表格-> body_part

print(results)
0                      Name            ...                              Returns
0             Kent Bazemore            ...                Targeting mid-January
1            Taurean Prince            ...                           Day-to-day
2   Rondae Hollis-Jefferson            ...                           Day-to-day
3               Dzanan Musa            ...                           Day-to-day
4              Allen Crabbe            ...                Targeting mid-January
5              Caris LeVert            ...                   Targeting February
6             Marcus Morris            ...                           Day-to-day
7              Kyrie Irving            ...                           Day-to-day
8           Robert Williams            ...                           day-to-day
9               Aron Baynes            ...                    Targeting MLK Day
10               Malik Monk            ...                           Day-to-day
11              Cody Zeller            ...             Targeting All-Star break
12              Jeremy Lamb            ...                           day-to-day
13             Bobby Portis            ...                Targeting mid-January
14         Denzel Valentine            ...                       Out for season
15      Matthew Dellavedova            ...                           Day-to-day
16               Ante Zizic            ...                           Day-to-day
17              David Nwaba            ...                           Day-to-day
18               J.R. Smith            ...                     Out indefinitely
19              John Henson            ...                     Out Indefinitely
20               Kevin Love            ...                Targeting mid-January
21              Will Barton            ...                         week-to-week
22        Jarred Vanderbilt            ...                     Out indefinitely
23       Michael Porter Jr.            ...                     Out indefinitely
24            Isaiah Thomas            ...                   Targeting December
25            Zaza Pachulia            ...                           Day-to-day
26                Ish Smith            ...                     Out Indefinitely
27           Henry Ellenson            ...                     Out indefinitely
28             Damian Jones            ...                     Out Indefinitely
29         DeMarcus Cousins            ...                   Targeting January?
..                      ...            ...                                  ...


[74 rows x 7 columns]

表格-> 自定义视频

+-----+-----------|
| id  | title     |  
------------------|
| 1     Abs
| 2     Chest
| 3     Neck
------------------ 

SQL

+-----+-----------|
| id  | body_part |  
------------------|
| 1     2,1,3     |
------------------|

结果

SELECT  vc.body_part  ,
  GROUP_CONCAT(bp.name ORDER BY vc.body_part) 
 as body_part_name FROM 
 `video_customised` `vc`
LEFT JOIN `body_part` as `bp` ON 
  `FIND_IN_SET`(bp.id, vc.body_part); 

预期结果:

+-----+-----------------------|
| body_part  | body_part_name |  
------------------------------|
| 2,1,3         Abs,Chest,Neck|     
------------------------------| 

我要GROUP_CONCAT body_part_name,其顺序应与body_part相同。

1 个答案:

答案 0 :(得分:4)

您需要修复数据模型。您不应将数字列表存储在单个字段中。为什么?

  • 在SQL表中,一列应包含一个值。
  • 数值应存储为数字,而不是字符串
  • 应该正确定义外键关系。
  • SQL的字符串处理能力相对较差。
  • SQL并非旨在优化对字符串的查询。

您应该使用联结/关联表,每个身体部位和每个视频一行。

也就是说,有时候我们会被非常,非常,非常糟糕的设计决策所束缚。在这种情况下,您可以使用find_in_set()做您想做的事情:

SELECT vc.body_part,
       GROUP_CONCAT(bp.name ORDER BY FIND_IN_SET(bp.id, vc.body_part)) as body_part_names
FROM video_customised vc LEFT JOIN
     body_part bp
     ON FIND_IN_SET(bp.id, vc.body_part); 
GROUP BY vc.body_part;