2016-10-16 8 views
7

संपादित करें: मैंने इसे PHP और MySQL श्रेणियों दोनों में रखा है क्योंकि मुझे लगता है कि एकाधिक प्रश्नों का उपयोग करके ऐसा करने का एक तरीका हो सकता है और PHP का उपयोग करके उन्हें एक साथ जोड़ना है। मैं यह नहीं करूँगा ... लेकिन दिन के अंत में, एक समाधान एक समाधान है ...MySQL किसी अन्य तालिका के टाइमस्टैम्प पर आधारित जानकारी चुनना

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

चूंकि हमारे डीबी में पहले से ही कई फीड हैं, इसलिए मैं फ़ीड तालिका में कॉलम में जोड़ने में असमर्थ हूं, यह दर्शाता है कि किस सदस्यता प्रकार उपयोगकर्ता ने पोस्ट किया है। यहाँ क्या मेरी तालिकाओं (संक्षिप्त) अगर कोई ऐसा करने के तरीके के एक प्रश्न विचार है यह देखने के लिए की तरह लग रहा है:

उपयोगकर्ता तालिका

id username membershipid 
1 John Doe 1 

सदस्यता टेबल

id membershipname 
1 Membership #1 
2 Membership #2 
3 Membership #3 

सदस्यता इतिहास तालिका

id membershipsid usersid unix_timestamp 
1 1    1  1476635544.33 
2 2    1  1476641890.11 
3 3    1  1476642124.2 
4 1    1  1476642161.51 

फ़ीड्स तालिका

id unix_timestamp  usersid 
1 1476641716.809361 1 
2 1476641783.866863 1 
3 1476641822.779324 1 
4 1476641904.066237 1 
5 1476641973.767174 1 
6 1476642182.821472 1 

यह unix_timestamps साथ जल्दी से देखना मुश्किल है ... लेकिन मैं क्या चाहते हैं एक समाधान प्रदान करने के लिए के लिए यह है: अब तक सदस्यता टेबल

membershipid feedcount 
1    4 
2    2 
3    0 

द्वारा

फ़ीड गणना, मैं बहुत सी बातें कोशिश की है, लेकिन वे सभी मौजूदा सदस्यता उपयोगकर्ता है ... इस तरह के रूप प्रदान करने अंत:

SELECT 
    a.MembershipName MembershipName, 
    COUNT(*) Feeds 
FROM (SELECT 
     m.membership_name MembershipName 
    FROM feeds f 
    JOIN users u ON f.usersid = u.id 
     JOIN memberships m ON u.membership_id = m.id 
    GROUP BY f.id 
    ORDER BY f.unix_timestamp DESC) a 
    GROUP BY a.MembershipName 
ORDER BY a.MembershipName 

लेकिन इस सदस्य के साथ कुछ नहीं करता है जहाज इतिहास तालिका, इसलिए मेरे उत्पादन तालिका है:

फ़ीड सदस्यता टेबल द्वारा गणना

membershipid feedcount 
1    6 
2    0 
3    0 

जो गलत है, के रूप में यह होना चाहिए 1-> 4, 2-> 2 & 3> 0 दिखाया गया है उपरोक्त तालिका में। किसी से भी कोई विचार?

+0

तुम्हारा के समान स्थिति: http://stackoverflow.com/questions/4070476/sql-query-to-join-two-tables-based-off-closest-timestamp# उनकी 'वर्गीकरण' तालिका आपकी सदस्यता इतिहास तालिका होगी और उनकी 'बंद_cases' तालिका आपकी फ़ीड्स तालिका – Terminus

+0

होगी यह एक बिल्कुल समान सवाल है ... मैं यह देखने जा रहा हूं कि क्या मैं इसे दोहराना चाहूंगा। एक मुद्दा जो मैं चल रहा हूं वह यह है कि उसका समाधान केवल 'एंडटाइम' के साथ एक नया कॉलम जोड़कर हल किया गया था। मैं सदस्यता समाप्त करता हूं कि इस उपयोगकर्ता के लिए सदस्यता_history तालिका –

उत्तर

1

नोट # 1 - क्वेरी, जो आप चाहते, बहुत महंगी है मेरी सलाह बस समय फ़ीड

पोस्ट किया जाता है पर फ़ीड तालिका में वर्तमान membershipsid को बचाने के लिए है

नोट # 2 - नीचे दी गई क्वेरी मानती है कि सदस्यता इतिहास में प्रति उपयोगकर्ता कम से कम एक प्रविष्टि होती है, न केवल जब यह बदली जाती है (इसलिए पहली बार इसे ऐतिहासिक रिकॉर्ड सौंपा गया है)

जिस तरह से मैंने सोचा था कि आपका समाधान "कैसे है क्या मैं समय एक्स पर सदस्यता आईडी मान पूछता हूं?कैसे मैं सभी फ़ीड एक साथ सूची के साथ सदस्यता आईडी जहां X समय था जब चारा था: "

SELECT h.membershipsid 
FROM membershipshistory h 
WHERE h.usersid = {USERID} AND h.unix_timestamp < {X} 
ORDER BY h.unix_timestamp DESC 
LIMIT 1 

अगला बात है, इस सवाल का जवाब आसान है, है सबसे हाल ही में बदली हुई मूल्य समय एक्स से पहले है यह" की तैनाती?

SELECT 
    feeds.id, 
    feeds.usersid, 
    (
    SELECT h.membershipsid 
    FROM membershipshistory h 
    WHERE h.usersid = feeds.usersid AND h.unix_timestamp < feeds.unix_timestamp 
    ORDER BY h.unix_timestamp DESC 
    LIMIT 1 
) AS historical_membershipsid 
FROM 
    feeds 

(मेरी नमूना डेटा से) कौन सा आउटपुट:

+------+---------+--------------------------+ 
| id | usersid | historical_membershipsid | 
+------+---------+--------------------------+ 
| 1 |  1 |      1 | 
| 2 |  1 |      2 | 
| 3 |  1 |      3 | 
+------+---------+--------------------------+ 

यह एक अपने समाधान तुच्छ होना चाहिए से, बस एक दृश्य या historical_membershipsid द्वारा सबक्वेरी और समूह में पूरे क्वेरी डाल दिया, लेकिन यह याद रखना बहुत कीमती है।

अद्यतन

मैं माफी माँगता हूँ अगर अंतिम समाधान है कि स्पष्ट नहीं था, यहां ऐतिहासिक डेटा का उपयोग कर सदस्यता प्रति फ़ीड गिनती करने के लिए अंतिम क्वेरी है:

SELECT 
    hf.historical_membershipsid AS membershipsid, 
    COUNT(hf.id) AS feedcount 
FROM (
    SELECT 
    feeds.id, 
    feeds.usersid, 
    (
     SELECT h.membershipsid 
     FROM membershipshistory h 
     WHERE h.usersid = feeds.usersid AND h.unix_timestamp < feeds.unix_timestamp 
     ORDER BY h.unix_timestamp DESC 
     LIMIT 1 
    ) AS historical_membershipsid 
    FROM 
    feeds) AS hf 
GROUP BY 
    hf.id 
+0

ठीक है ... मैंने कुछ देखा है और आपके सुझाव के साथ थोड़ा खेला है। मैं देख सकता हूं कि आप कहां जा रहे हैं, लेकिन मैं आपसे सहमत हूं कि यह बहुत महंगा है। मेरा मानना ​​है कि एक आसान तरीका होना चाहिए। आपके सुझाव के साथ एक सवाल यह है कि आप कैसे प्राप्त कर रहे हैं ... 'जहां h.usersid = {USERID} और h.unix_timestamp <{X}' ... मुझे यकीन नहीं है कि वास्तव में लूप के बिना सही उपयोगकर्ता आईडी कैसे प्राप्त करें जो हर उपयोगकर्ता पर जाता है और उनमें से प्रत्येक के लिए यह करता है। शायद मैं सिर्फ गलतफहमी हूँ। –

+0

दूसरे स्निपेट में मैं फ़ील्ड सब-सिलेक्ट के रूप में पहली क्वेरी का उपयोग कर रहा हूं, इसका मतलब है कि उप-क्वेरी का फीड टेबल की प्रत्येक पंक्ति के लिए मूल्यांकन किया जाता है, प्रत्येक बार वर्तमान उपयोगकर्ता आईडी के साथ "feeds.usersid" को प्रतिस्थापित करता है ... – Johnny

+0

आह .. निश्चित रूप से। मैं काफी बड़ी तस्वीर नहीं देख रहा था। मैं अब देख सकता हूँ। क्षमा करें ... मैं इसे फिर से देख रहा हूं –

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