我在一个PHP项目中有一个特例,在该项目中我正在使用没有第三范式结构的数据库。该数据库仅包含1个表,其中包含许多列。某些应该在单独的表中的数据被限制在1列中,并以某个符号(在本例中为分号“;”)分隔。
在其他列中,应将钳位数据移至与上述相同的单独表中。这一定很令人困惑,所以让我详细说明一下:
**HugeTable**
id | Column1 | Column2 | Column3
123 | 数据1;数据2数据3;数据4数据5;数据6
我需要将上面的数据放在一个单独的表中,如下所示:
**NewTable**
id | idHugeTable | Column1 | Column2 | Column3
1 | 123 | Data1 | Data3 | Data5
2 | 123 | Data2 | Data4 | Data6
因此,对于巨大表中的每个固定数据,我需要在新表中新建一行。这个过程将帮助我规范化数据库,以便至少可以使用。现在是一场噩梦。这需要通过PHP或MySQL来完成,最好是PHP,因为通过脚本语言对每个循环的一次性查询而言,循环更容易。
编辑:我在PHP中尝试过的示例代码:
$delimiter = ";";
$query = "SELECT * FROM HugeTable";
$result = mysqli_query($connection_var, $query);
while ($row = mysqli_fetch_assoc()){
$column1_data = explode($delimiter, $row['Column1']);
$column2_data = explode($delimiter, $row['Column2']);
$column3_data = explode($delimiter, $row['Column3']);
foreach ($column1_data as $key => $value){
//skip if empty value
if ($value == ""){
continue;
}
else{
$query_ins = "INSERT INTO NewTable (idHugeTable, Column1, Column2, Column3) VALUES (".$row['id'].", ".$column1_data[$key].", ".$column2_data[$key].", ".$column3_data[$key].");";
mysqli_query($connection_var, $query_ins);
}//end if
}//end foreach
}//end while
mysqli_close($connection_var);
不需要PHP。您只能使用纯MySQL代码执行此操作。
创建表/插入表
CREATE TABLE HugeTable
(`Column1` VARCHAR(11), `Column2` VARCHAR(11), `Column3` VARCHAR(11))
;
INSERT INTO HugeTable
(`Column1`, `Column2`, `Column3`)
VALUES
('Data1;Data2', 'Data3;Data4', 'Data5;Data6')
;
CREATE TABLE NewTable
(`Column1` VARCHAR(11), `Column2` VARCHAR(11), `Column3` VARCHAR(11))
;
首先,我们需要MySQL来生成数字。此MySQL代码生成1到100。因此,最终查询将支持多达100个分隔的值。
询问
SELECT
@row := @row + 1 AS ROW
FROM (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
SELECT @row := 0
) init_user_params
结果
row
--------
1
2
3
4
5
6
7
8
9
10
...
...
90
91
92
93
94
95
96
97
98
99
100
现在我们可以看看在上分开的方法;定界符。我们可以为此使用嵌套的SUBSTRING_INDEX函数
询问
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('Data1;Data2', ';', 1), ';', -1) AS DATA
结果
data
--------
Data1
如果我们希望我们可以使用第二个单词,则只能看到第一个单词被返回
询问
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('Data1;Data2', ';', 2), ';', -1) AS DATA
结果
data
--------
Data2
现在我们结合数字生成器和SUBSTRING_INDEX来生成数据
询问
SELECT
DISTINCT
SUBSTRING_INDEX(SUBSTRING_INDEX(Column1, ';', rows.row), ';', -1) Column1
, SUBSTRING_INDEX(SUBSTRING_INDEX(Column2, ';', rows.row), ';', -1) Column2
, SUBSTRING_INDEX(SUBSTRING_INDEX(Column3, ';', rows.row), ';', -1) Column3
FROM (
SELECT
@row := @row + 1 AS ROW
FROM (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
SELECT @row := 0
) init_user_params
)
ROWS
CROSS JOIN
HugeTable
结果
Column1 Column2 Column3
------- ------- ---------
Data1 Data3 Data5
Data2 Data4 Data6
查询新表
INSERT INTO
NewTable
SELECT
DISTINCT
SUBSTRING_INDEX(SUBSTRING_INDEX(Column1, ';', rows.row), ';', -1) Column1
, SUBSTRING_INDEX(SUBSTRING_INDEX(Column2, ';', rows.row), ';', -1) Column2
, SUBSTRING_INDEX(SUBSTRING_INDEX(Column3, ';', rows.row), ';', -1) Column3
FROM (
SELECT
@row := @row + 1 AS ROW
FROM (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
SELECT @row := 0
) init_user_params
)
ROWS
CROSS JOIN
HugeTable
询问
SELECT * FROM NewTable
结果
Column1 Column2 Column3
------- ------- ---------
Data1 Data3 Data5
Data2 Data4 Data6
主要内容:使用 MySQLi 和 PDO 创建 MySQL 数据库,实例 (MySQLi - 面向对象),实例 (MySQLi Procedural),实例数据库存有一个或多个表。 你需要 CREATE 权限来创建或删除 MySQL 数据库。 使用 MySQLi 和 PDO 创建 MySQL 数据库 CREATE DATABASE 语句用于在 MySQL 中创建数据库。 在下面的实例中,创建了一个名为 "myDB" 的数据库: 实例 (MySQLi - 面向对象) <?php $serverna
问题内容: 祝大家有美好的一天。我有一个奇怪的错误。我创建了一个像这样的聊天: 问题/答案插入数据库 每2秒将ajax请求发送到php脚本,以获取新的问题/答案 直到今天,当我收到此错误时,它运行良好: 问题是我们不是那么多…(8),我不认为数据库不能同时支持超过8到16个连接(根据规范,聊天必须支持50-100个用户,因此8个是…小)。 所以…有人可以告诉我为什么会发生这种情况吗(昨天我们15岁
问题内容: 我有下表: 我想查看有关这些产品的保修状态的摘要。保修期为自购买之日起的5年。因此,从今天起,应该可以检查产品是否在保修期内(基于购买日期)。我也想现在最后购买的产品将不在保修范围内。这是一个示例表: 我尝试为该示例创建查询,但是我不知道如何循环显示每个产品的结果以计算有效保修等。这就是我目前所拥有的: 我不知道如何编写子查询,因为我需要使用WHERE product = Hammer
在下面的代码: 在上面的代码中,我从用户那里得到一个表名列表,然后在for循环中对它们进行迭代。代码正在工作,但它没有将数据插入临时表并以错误结束。 错误: 请帮我找出为什么会出现这个错误?
问题内容: 使用PHP ,我想做一个while循环,该循环读取一个大文件并在请求时发送当前行号。 使用Ajax ,我想获取当前行数并将其打印到页面上。 使用html按钮 ,我希望能够单击并激活或终止仅运行一次并调用 ajax方法 的javascript线程。 我给了它一个镜头,但是由于某种原因,除非我注释掉该函数,否则什么都不会打印,当注释掉它时,它将显示整个循环结果: 已处理1行,已处理2行,已
如果我有这样的数据: 有人能告诉我javascript函数在数据上循环并使用相同的键重新创建数据结构的样子吗?但是值将是由 希望这是有意义的,寻找这样的最终输出: