Mysql将列拆分为3列,以便在phpMyAdmin中查看

Mysql将列拆分为3列,以便在phpMyAdmin中查看,mysql,sql,split,phpmyadmin,Mysql,Sql,Split,Phpmyadmin,我对编写SQL查询非常陌生——我希望在前端应用程序中创建一些图表,但必须操作数据来创建视图,因为前端不太适合运行复杂的查询 以下是我目前的情况: 我有一个包含客户机数据和记录创建日期的表。这是一个没有特殊顺序的样品 | ID | post_date | post_title | ------------------------------------------- | 1654 | 2017-09-04 | Bill Smith (5678)| | 1658 |

我对编写SQL查询非常陌生——我希望在前端应用程序中创建一些图表,但必须操作数据来创建视图,因为前端不太适合运行复杂的查询

以下是我目前的情况: 我有一个包含客户机数据和记录创建日期的表。这是一个没有特殊顺序的样品

|  ID  |   post_date   |    post_title    |
-------------------------------------------
| 1654 |  2017-09-04   | Bill Smith (5678)|
| 1658 |  2017-09-05   | Jan Jones (3423) |
| 1878 |  2017-08-17   | Jim Tanz (7890)  |
| 1659 |  2017-09-06   | Jan Jones (3425) |
我想按姓氏显示唯一的值,但目前所有的名称都在一列中。ID是唯一的,因为它为每个记录递增,并且附加到姓氏的括号中的数字(事务ID)也是唯一的,并且来自我们从中提取名称的另一个应用程序

我已经能够将post_title列拆分为2列,但只剩下FName和LastName(TrID),这不允许我按姓氏选择不同的条目来进行客户端计数,因为TrID都是不同的

我的意图是创建一个包含3列的视图,然后按姓氏显示不同的条目,并统计每个月的客户数量,以查看是否有任何客户增长,但我仍处于非常早期的阶段

任何帮助都将不胜感激(并永远铭记:>)
谢谢

某些文本操作可能会起作用:

SELECT t.post_title
      ,LEFT(t.post_title, LOCATE(' ', post_title )) AS FName
      ,SUBSTR(t.post_title, LOCATE(' ', post_title)+1, LOCATE(' ',post_title,LOCATE(' ', post_title)+1)-LOCATE(' ', post_title)) AS LName
      ,REPLACE(REPLACE(TRIM(RIGHT(t.post_title,LOCATE(' ', REVERSE(post_title)))), '(', ''), ')','') AS ID
FROM (SELECT 'Bill Smith (5678)' AS post_title
      UNION SELECT 'Jan Jones (3423)'
      UNION SELECT 'Jim Tanz (7890)') t;

某些文本操作可能会起作用:

SELECT t.post_title
      ,LEFT(t.post_title, LOCATE(' ', post_title )) AS FName
      ,SUBSTR(t.post_title, LOCATE(' ', post_title)+1, LOCATE(' ',post_title,LOCATE(' ', post_title)+1)-LOCATE(' ', post_title)) AS LName
      ,REPLACE(REPLACE(TRIM(RIGHT(t.post_title,LOCATE(' ', REVERSE(post_title)))), '(', ''), ')','') AS ID
FROM (SELECT 'Bill Smith (5678)' AS post_title
      UNION SELECT 'Jan Jones (3423)'
      UNION SELECT 'Jim Tanz (7890)') t;

您可以使用
子字符串\u INDEX
分隔字符串,以便检索名字:

SUBSTRING_INDEX(post_title," ",1)
这会得到空间的第n个实例之前的所有内容,因此得到姓氏有点混乱,因为使用“2”时,我们会得到第二个空间之前的值,然后我们需要提取第二个值(-1,向后)。因此,获取“姓氏”是通过以下方式完成的:

SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1)
场景1:
post\u title
拆分为三个字段:

SELECT
SUBSTRING_INDEX(post_title," ",1) as firstName, 
SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1) as lastName,
SUBSTRING_INDEX(REPLACE(REPLACE(post_title,"(",""),")","")," ",-1) as post_ID
FROM tableName;
输出:

+-----------+----------+---------+
| firstName | lastName | post_ID | 
---------------------------------+
| Bill      | Smith    | 5678    | 
| Jan       | Jones    | 3423    | 
| Jim       | Tanz     | 7890    | 
| Jan       | Jones    | 3425    | 
+-----------+----------+---------+
+-----+----------+
| Qty | lastName |
+-----+----------+
|  2  | Jones    |
|  1  | Smith    | 
|  1  | Tanz     |
+-----+----------+
场景2:分组功能

您还可以使用命名字段按姓氏分组和计数

SELECT
COUNT(*) as Qty,
SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1) as lastName
FROM tableName
GROUP BY lastName;
输出:

+-----------+----------+---------+
| firstName | lastName | post_ID | 
---------------------------------+
| Bill      | Smith    | 5678    | 
| Jan       | Jones    | 3423    | 
| Jim       | Tanz     | 7890    | 
| Jan       | Jones    | 3425    | 
+-----------+----------+---------+
+-----+----------+
| Qty | lastName |
+-----+----------+
|  2  | Jones    |
|  1  | Smith    | 
|  1  | Tanz     |
+-----+----------+

等等。很难进一步调整,因为我不完全确定您打算做什么,但希望上面的内容有用。

您可以使用
子字符串\u INDEX
来分隔字符串,以便检索第一个名称:

SUBSTRING_INDEX(post_title," ",1)
这会得到空间的第n个实例之前的所有内容,因此得到姓氏有点混乱,因为使用“2”时,我们会得到第二个空间之前的值,然后我们需要提取第二个值(-1,向后)。因此,获取“姓氏”是通过以下方式完成的:

SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1)
场景1:
post\u title
拆分为三个字段:

SELECT
SUBSTRING_INDEX(post_title," ",1) as firstName, 
SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1) as lastName,
SUBSTRING_INDEX(REPLACE(REPLACE(post_title,"(",""),")","")," ",-1) as post_ID
FROM tableName;
输出:

+-----------+----------+---------+
| firstName | lastName | post_ID | 
---------------------------------+
| Bill      | Smith    | 5678    | 
| Jan       | Jones    | 3423    | 
| Jim       | Tanz     | 7890    | 
| Jan       | Jones    | 3425    | 
+-----------+----------+---------+
+-----+----------+
| Qty | lastName |
+-----+----------+
|  2  | Jones    |
|  1  | Smith    | 
|  1  | Tanz     |
+-----+----------+
场景2:分组功能

您还可以使用命名字段按姓氏分组和计数

SELECT
COUNT(*) as Qty,
SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1) as lastName
FROM tableName
GROUP BY lastName;
输出:

+-----------+----------+---------+
| firstName | lastName | post_ID | 
---------------------------------+
| Bill      | Smith    | 5678    | 
| Jan       | Jones    | 3423    | 
| Jim       | Tanz     | 7890    | 
| Jan       | Jones    | 3425    | 
+-----------+----------+---------+
+-----+----------+
| Qty | lastName |
+-----+----------+
|  2  | Jones    |
|  1  | Smith    | 
|  1  | Tanz     |
+-----+----------+

等等。很难进一步调整,因为我不完全确定您打算做什么,但希望上面的内容有用。

您能详细说明您想要显示什么吗?我不太清楚你是在寻找所有唯一的姓氏,只是显示每行的姓氏,或者按姓氏分组,或者只是将帖子标题分成三个字段(名字、姓氏、id)……或者其他什么!谢谢Chris-将文本分成3个单独的列,如firstName | lastName | post | u ID |你能详细说明你想显示什么吗?我不太清楚你是在寻找所有唯一的姓氏,只是显示每行的姓氏,或者按姓氏分组,或者只是将帖子标题分成三个字段(名字、姓氏、id)……或者其他什么!谢谢克里斯-这将是分裂成3个单独的栏目,如firstName | lastName | post|u ID |谢谢克里斯-这是伟大的,将真正有帮助!!谢谢克里斯-这太棒了,真的很有帮助!!