以下代码是我为描述自己的情况而制作的示例。
我有3个带有多个选项的html“选择”。每天,用户必须为每个“选择”至少选择一个选项。
zoneID
此数据库结构每个只能接受一个OptionType值。
<html>
<head></head>
<body>
<form id="frm" action="Save.php" method="POST">
<input type="text" id="datepicker" name="datepicker" readonly='true'>
<select id="OptionType1" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<select id="OptionType2" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<select id="OptionType3" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
</form>
</body></html>
CREATE TABLE `m` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Client ID` int(11) DEFAULT '0',
`Date` date DEFAULT NULL,
`Category` int(11) DEFAULT '0' COMMENT 'categoryA-1,categoryB-2,categoryC-3',
`OptionsType1` int(11) DEFAULT '0',
`OptionsType2` int(11) DEFAULT '0',
`OptionsType3` int(11) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
,Client ID
,Date
用于创建唯一索引。唯一索引用于“在重复密钥更新中插入...”。我使用唯一索引的原因是用户可以返回并编辑其选项,而mysql将根据唯一索引对其进行更新。
由于唯一索引,我无法使用相同的Category
,Client ID
,Date
进行多行。我唯一的选择是将我的值连接到同一行中,但是如果我决定沿线查找这些值,则可能会导致性能问题。
任何人都可以帮助我解决这一难题。我需要正确的结构来保存多个值,并能够将其重新加载到html上,并让用户能够对其进行更新。谢谢
更新: 创建了两个表
Category
是否有一种无需删除即可替换现有数据(c表)的方法。唯一索引在仅c表主键上不存在,但是在加载html表单时我不跟踪它。
答案 0 :(得分:1)
如果您不想连接,则可以为这些值创建一个新表,并引用m
表。
对于m
表,您可以用保留了OptionsType编号的一列替换OptionsType [1-3]字段,并将此新列添加到共享唯一键中。
在值表中,您引用m
表的ID,并在其中放置选项号和用户选择。
要详细说明解决方案,请在接受引用表并调整问题后:
首先,我展示了表的创建,然后我对其进行了解释。
表m
CREATE TABLE `m` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
`Client ID` INT(11) NOT NULL,
`Date` DATE NOT NULL,
`Category` INT(11) NOT NULL COMMENT 'categoryA-1,categoryB-2,categoryC-3',
`OptionsType` INT(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `Client ID_Date_Category_OptionsType` (`Client ID`, `Date`, `Category`, `OptionsType`)
) ENGINE=InnoDB;
表c
CREATE TABLE `c` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
`mID` INT(11) NOT NULL,
`Option` INT(11) NOT NULL,
`Value` INT(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `mID_Option` (`mID`, `Option`),
INDEX `mID` (`mID`)
) ENGINE=InnoDB;
说明
将OptionsType
添加到表m
中。在表c
中,您通过m
引用了表m.ID=c.mID
。为确保不保留重复项,在mID
和Option
上设置了唯一索引。Option
列显示了所引用的选项,而value
列显示了对选项的选择。用户。使用这种模式,您也不局限于每个选择三个选项。
示例查询
SELECT * FROM `m` INNER JOIN `c` ON `m`.`ID`=`c`.`mID`;
+----+-----------+------------+----------+-------------+----+-----+--------+-------+
| ID | Client ID | Date | Category | OptionsType | ID | mID | Option | Value |
+----+-----------+------------+----------+-------------+----+-----+--------+-------+
| 1 | 4711 | 2018-06-27 | 1 | 1 | 1 | 1 | 1 | 0 |
| 1 | 4711 | 2018-06-27 | 1 | 1 | 2 | 1 | 2 | 1 |
| 1 | 4711 | 2018-06-27 | 1 | 1 | 3 | 1 | 3 | 0 |
| 3 | 4711 | 2018-06-27 | 1 | 2 | 7 | 3 | 1 | 0 |
| 3 | 4711 | 2018-06-27 | 1 | 2 | 8 | 3 | 2 | 1 |
| 3 | 4711 | 2018-06-27 | 1 | 2 | 9 | 3 | 3 | 0 |
+----+-----------+------------+----------+-------------+----+-----+--------+-------+
6 rows in set (0.00 sec)