2012-06-20 16 views
6

मैं अपनी साइट पर प्रोफ़ाइल के लिए "हालिया गतिविधि" टैब बना रहा हूं और मुझे साइट पर होने वाली हर चीज़ को देखने के लिए मॉडरेटर के लिए लॉग भी होगा। इसके लिए किसी प्रकार का गतिविधि लॉग करने की आवश्यकता होगी।एक गतिविधि लॉग बनाने के लिए सबसे प्रभावी तरीका

मुझे नहीं पता कि बेहतर क्या होगा।

  1. एक मेज "गतिविधि" कहा जाता है सुनिश्चित करें और फिर हर बार जब कोई कुछ, एक रिकॉर्ड यह करने आदि कार्रवाई के प्रकार, उपयोगकर्ता आईडी, टाइमस्टैम्प,
    • समस्या के साथ जोड़ता है: मैं 2 विकल्प हैं : तालिका बहुत लंबी हो सकती है।
  2. सभी 3 तालिकाओं (प्रश्न, उत्तर, answer_comments) और फिर किसी भी तरह जिस क्रम में कार्रवाई की गई थी में पृष्ठ पर इन सभी को दिखाने में शामिल हों।
    • समस्या: इस बेहद मुश्किल होगा क्योंकि मुझे लगता है मैं यह कैसे कहते हैं कि कर सकता है कोई सुराग नहीं है "जॉन पर प्रश्न शीर्षक यहाँ एक उत्तर पर टिप्पणी की" सिर्फ 3 टेबल में शामिल होने से।

किसी को भी इस स्थिति में एक गतिविधि लॉग बनाने का एक बेहतर तरीका है के बारे में पता है? मैं PHP और MySQL का उपयोग कर रहा हूँ। यदि यह या तो बहुत अक्षम या कठिन है, तो शायद मैं प्रोफ़ाइल पर हालिया गतिविधि टैब को भूल जाऊंगा लेकिन मुझे अभी भी मॉडरेटर के लिए एक गतिविधि लॉग की आवश्यकता है।

यहाँ कुछ एसक्यूएल कि मैं विकल्प 2 के लिए करना शुरू कर दिया है, लेकिन पता लगाने के लिए कि क्या कार्रवाई एक टिप्पणी, सवाल यह है कि का कोई रास्ता नहीं है, क्योंकि यह काम नहीं होता है, या जवाब देने के जब मैं एक while पाश में जानकारी गूंज:

SELECT q.*, a.*, ac.* 
    FROM questions q JOIN answers a ON a.questionid = q.qid 
     JOIN answer_comments ac ON c.answerid = a.ans_id 
WHERE q.user = $userid 
AND a.userid = $userid 
AND ac.userid = $userid 
    ORDER BY q.created DESC, a.created DESC, ac.created DESC 

किसी भी मदद के लिए अग्रिम धन्यवाद!

उत्तर

1

आपके पास q.user और q.userid क्यों है?

विकल्प 2 के लिए (बेहतर विकल्प आईएमओ - जब तक आप ठीक से अनुक्रमित करते हैं), मुझे लगता है कि UNION और अधिक है जो आप खोज रहे हैं। कुछ इस तरह:

SELECT 'question' AS action, id, created 
    FROM questions WHERE userid = {$userid} 
    UNION 
SELECT 'answer' AS action, id, created 
    FROM answers WHERE userid = {$userid} 
    UNION 
SELECT 'comment' AS action, id, created 
    FROM answer_comments WHERE userid = {$userid} 
ORDER BY created DESC LIMIT 20 

'question'/'answer'/'comment' आपको यह बताती है कार्रवाई की गई थी। संभावित समस्याएं जिनमें आप चल सकते हैं: UNION होने के नाते, प्रत्येक SELECT कथन में समान संख्या में कॉलम होना चाहिए, इसलिए यदि कोई छोटा है, तो आप केवल NULL उदा।:

SELECT 'comment', id, created, NULL FROM ac 

इसके अलावा, अगर created स्तंभों में से एक एक अलग नाम है आप कर सकते हैं बस उर्फ ​​

SELECT 'comment', id, comment_date AS created FROM ac 
+0

क्षमा करें, दूसरा वास्तव में होना चाहिए 'a.userid' (वह एक टाइपो था)। वैसे भी बहुत बहुत धन्यवाद! मैं इसे करने की कोशिश कर रहा हूं और यदि यह काम करता है तो मैं आपका जवाब स्वीकार करूँगा: डी और यह पहचानने के लिए धन्यवाद कि यह एक टिप्पणी, प्रश्न या उत्तर है क्योंकि मुझे कभी नहीं पता था कि आप ऐसा कर सकते हैं। – Nathan

+0

यह बहुत अधिक काम करता है :) मुझे प्रश्न जानकारी प्राप्त करने के लिए प्रश्न तालिका में शामिल होने के साथ बस एक छोटी सी समस्या है इसलिए इसे लिंक और सामान जोड़ा जा सकता है। यहां SQL और PHP है: http://screencast.com/t/EJgdGkMPBB टिप्पणियों के किसी कारण से ऐसा लगता है कि यह प्रश्न आईडी को शीर्षक के रूप में दिखा रहा है और फिर उत्तर के लिए यह शीर्षक बिल्कुल नहीं दिखा रहा है: http: //screencast.com/t/qvDzliDs9U मुझे पता है कि कुछ सामान अभी तक '$ पंक्ति ['qSlug']' और सामान (जो शीर्षक का यूआरएल स्लग है) में नहीं है लेकिन इससे प्रभावित नहीं होना चाहिए अन्य सामान – Nathan

+0

एसोसिएटिव कुंजी का नाम ** पहले ** 'चयन' से आता है। आपको पहले सभी सामान्य कॉलम का चयन करना चाहिए ('आईडी, बनाया गया, q_id, q_title'), फिर अंतिम कॉलम (' a.ans_id' और 'ac.id') चुनें। यह कोई दोष नहीं है - 'यूनियन' को एक ही डेटा का चयन करने के लिए डिज़ाइन किया गया है। रिक्त शीर्षक के लिए, आप 'q_title' के बजाय' qTitle' का उपयोग कर रहे हैं। – andrewtweber

1

मुझे "विकल्प 2" पसंद है, तो आप मूल रूप से अपने डेटा को डुप्लिकेट कर देंगे और यह अतिरिक्त पढ़ने/लिखने के साथ चीजों को धीमा कर देगा। हो सकता है कि बजाय करने का एक

SELECT q.*, a.*, ac.* 

आप कर सकते थे या तो केवल डेटा है कि आप प्रत्येक मेज से की जरूरत है, या एक से थोड़ा क्लीनर रास्ता तीन तालिकाओं का एक Union ऐसा करने के लिए, केवल उन पदों के लिए आपकी क्वेरी सीमित करने के बाद हो सकता है मिल चयनित उपयोगकर्ता द्वारा, और पोस्ट की तारीख से आदेश।

+0

यह एक अच्छा विचार की तरह लेकिन थोड़ी देर के पाश में लग रहा है कि कैसे मैं पता लगा सकता है अगर कार्रवाई एक है जवाब, प्रश्न, या टिप्पणी? अगर मैं ऐसा कर सकता हूं, तो यह काम करेगा और मैं कह सकता हूं: "{उपयोगकर्ता} ने प्रश्न शीर्षक पर एक उत्तर पर टिप्पणी की" अगर यह एक टिप्पणी है और फिर "{उपयोगकर्ता} प्रश्न शीर्षक पूछा गया है" यदि यह कोई प्रश्न है, तो – Nathan

+0

आप टाइप के लिए एक चर में जोड़ सकते हैं, उदाहरण के लिए प्रत्येक चयन कथन में स्ट्रिंग में फेंकने के लिए जो कुछ भी है: गतिविधि_ टाइप, q.field1, आदि के रूप में 'प्रश्न' चुनें ... –

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