निम्नलिखित कोड उदाहरण हैं जिन्हें मैंने अपनी स्थिति को चित्रित करने के लिए बनाया है।

मेरे पास एकाधिक विकल्पों के साथ 3 एचटीएमएल 'चयन' हैं। प्रत्येक दिन, उपयोगकर्ताओं को प्रत्येक 'चयन' के लिए कम से कम एक विकल्प का चयन करना होता है।

<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;

यह DB संरचना प्रत्येक में केवल एक OptionType मान ले सकती है।

Client ID,Date,Category का उपयोग एक अद्वितीय अनुक्रमणिका बनाने के लिए किया जाता है। अद्वितीय अनुक्रमणिका का उपयोग "इन्सर्ट इन... ऑन डुप्लीकेट की अपडेट" के लिए किया जाता है। मैंने अद्वितीय अनुक्रमणिका का उपयोग करने का कारण यह है कि उपयोगकर्ता वापस जा सकता है और अपना विकल्प संपादित कर सकता है और MySQL अद्वितीय अनुक्रमणिका के आधार पर इसे अपडेट करेगा।

अद्वितीय अनुक्रमणिका के कारण मैं एक ही Client ID,Date,Category के साथ कई पंक्तियाँ नहीं बना सकता। मेरा एकमात्र अन्य विकल्प एक ही पंक्ति में मेरे मूल्यों को एक साथ जोड़ना है, लेकिन अगर मैं लाइन के नीचे उन मूल्यों को देखने का फैसला करता हूं तो इससे प्रदर्शन समस्याएं हो सकती हैं।

क्या कोई इस दुविधा में मेरी मदद कर सकता है। मुझे अपने एकाधिक मूल्यों को सहेजने के लिए सही संरचना की आवश्यकता है और इसे एचटीएमएल पर वापस लोड करने में सक्षम होना चाहिए और उपयोगकर्ता इसे अपडेट करने में सक्षम है। धन्यवाद

अद्यतन: दो टेबल बनाए गए हैं

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',
PRIMARY KEY (`ID`),
UNIQUE KEY `uniq` (`Client ID`,`Date`,`Category`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `c` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`OptionsType1` int(11) DEFAULT '0',
`OptionsType2` int(11) DEFAULT '0',
`OptionsType3` int(11) DEFAULT '0',
`REF ID` int(11) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

क्या मौजूदा डेटा (सी टेबल) को हटाए बिना बदलने का कोई तरीका है। सी टेबल पर केवल प्राथमिक कुंजी पर अद्वितीय अनुक्रमणिका मौजूद नहीं है लेकिन एचटीएमएल फॉर्म लोड करते समय मैं इसका ट्रैक नहीं रखता हूं।

1
Ninjatalon 27 जून 2018, 00:21

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप संयोजित नहीं करना चाहते हैं, तो आप केवल मानों और m तालिका को संदर्भित करने के लिए एक नई तालिका बना सकते हैं।

m तालिका के लिए आप OptionsType[1-3] फ़ील्ड को एक कॉलम से बदल सकते हैं जिसमें OptionsType की संख्या बनी रहती है और इस नए कॉलम को साझा अद्वितीय कुंजी में जोड़ सकते हैं।

मान तालिका में, आप 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;

तालिका ग

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.ID=c.mID के माध्यम से तालिका m का संदर्भ देते हैं। यह सुनिश्चित करने के लिए कि कोई डुप्लीकेट जारी नहीं किया जा रहा है, एक अद्वितीय अनुक्रमणिका 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)

1
arueckauer 27 जून 2018, 21:23