2009-05-09 20 views
5

मेरे पास नीचे एक साधारण तालिका है।PHP MYSQL सम्मिलित करें/अपडेट करें

CREATE TABLE `stats` (
    `id` int(11) NOT NULL auto_increment, 
    `zones` varchar(100) default NULL, 
    `date` date default NULL, 
    `hits` int(100) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

तो प्रति दिन प्रति ज़ोन सरल हिट काउंटर संग्रहीत करना।

लेकिन मैं सिर्फ उसी दिन हिट मूल्य में वृद्धि करना चाहता हूं।

मैंने MYSQL डिप्लिकेट कुंजी अपडेट की कोशिश की है लेकिन यह काम नहीं करेगा क्योंकि मेरे पास अलग-अलग तिथियों पर कई जोन हो सकते हैं, इसलिए मैं उन्हें अद्वितीय या तिथियां नहीं बना सकता।

तो एक ही तरीका है मुझे लगता है कि कर सकते हैं एक प्रश्न प्राप्त करने वाली प्रथम है एक तारीख से मौजूद है तो है एक सरल है, तो() डालने के लिए/अद्यतन

उनके वहाँ के रूप में इस तरह के एक काम करने का एक बेहतर तरीका है देखने के लिए शायद प्रति दिन कई 1000 हिट हो।

आशा है कि यह समझ में आता है :-)।

और धन्यवाद यदि आप सलाह दे सकते हैं।

उत्तर

7

अपने CREATE कथन में अद्वितीय के रूप में tuple (zone, date) घोषित करें। इससे INSERT ... डिप्लिकेट अपडेट पर अपेक्षित कार्य पर:

CREATE TABLE `stats` (
    `id` int(11) NOT NULL auto_increment, 
    `zone` varchar(100) default NULL, 
    `date` date default NULL, 
    `hits` int(100) default NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE (`zone`, `date`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

INSERT INTO stats (zone, date, hits) values ('zone1', 'date1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; 
+1

मैंने कहा था कि मैंने डिप्लिकेट कुंजी अपडेट का उपयोग करने की कोशिश की है और यह काम नहीं करेगा क्योंकि ज़ोन और डेट अद्वितीय नहीं हो सकती है। उदाहरण के लिए एक ज़ोन में कई दिन होंगे। क्षेत्र - तिथि - हिट Zone1 - 2009-05-11 - 100 Zone2 - 2009-05-11 - 55 Zone1 - 2009-05-10 - 120 Zone2 - 2009-05-10 - 88 देखें Iig एक unqqe तारीख या जोन मैं उपर्युक्त उदाहरण से केवल 2 रिकॉर्ड होगा। :-( – Lee

+0

यूनिक (जोन, दिनांक) यह सुनिश्चित करता है कि जोन और दिनांक अद्वितीय * एक साथ * हो। यह एक ही क्षेत्र के साथ कई प्रविष्टियां पूरी तरह से ठीक है जब तक कि तिथियां अलग हों। यह एकाधिक प्रविष्टियों पर लागू होता है एक ही तारीख और विभिन्न जोन। लेकिन एक ही क्षेत्र * और * तिथि के साथ दो प्रविष्टियां नहीं होनी चाहिए। मुझे लगता है कि यह आपकी आवश्यकताओं से मेल खाता है। इसे एक परीक्षण डेटाबेस में आज़माएं और देखें कि यह काम करता है या नहीं। –

+0

बीमार फिर से प्रयास करें Ayman। मैं excatly था कि आप ऊपर था, लेकिन बीमार अब पुन: प्रयास करें। – Lee

1
$result = mysql_query("SELECT id FROM stats WHERE zone=$zone AND date=$today LIMIT 1"); 
if(mysql_num_rows($result)) { 
    $id = mysql_result($result,0); 
    mysql_query("UPDATE stats SET hits=hits+1 WHERE id=$id"); 
} else { 
    mysql_query("INSERT INTO stats (zone, date, hits) VALUES ($zone, $today, 1)"); 
} 

ऐसा कुछ, अगर मैंने आपको सही तरीके से व्याख्या की है ... यह पूरी तरह से अनचाहे है। आप यह पता लगा सकते हैं कि चर क्या हैं।

+1

यह समाधान संभावित दौड़ स्थिति से ग्रस्त है। –

+0

फिर उपरोक्त बेहतर समाधान का उपयोग करें: पी इसके बारे में नहीं सोचा था। अच्छी कॉल;) – mpen

संबंधित मुद्दे