मुझे पता है कि आपने पहले ही एक उत्तर स्वीकार कर लिया है, लेकिन मैं इसे आधा लिख रहा था इसलिए मैंने इसे वैसे भी पोस्ट करने का निर्णय लिया।
आशा के साथ आपके प्रश्न का उत्तर देने से पहले मैं थोड़ा पीछे जा रहा हूँ। एप्लिकेशन विकसित करते समय और डेटाबेस का निर्माण करते समय, आपको हमेशा . करना चाहिए चीजों को यथासंभव वर्णनात्मक और संक्षिप्त बनाने का प्रयास करें। color
. नाम का वेरिएबल/कॉलम रखना वाकई में अजीब होगा और वहां एन्क्रिप्टेड उपयोगकर्ता पासवर्ड स्टोर करें (अजीब, है ना?) कुछ मानक डेटाबेस नामकरण परंपराएँ हैं, जिनका पालन करने पर, विशेष रूप से जटिल अनुप्रयोगों को विकसित करते समय जीवन को बहुत आसान बना देता है। मैं आपको नामकरण परंपराओं के बारे में कुछ ब्लॉग पढ़ने की सलाह दूंगा। एक अच्छी शुरुआत हो सकती है यह
एक।
मुझे पूरी तरह से पता है कि नीचे सुझाए गए परिवर्तनों के साथ आपको अब तक लिखे गए एप्लिकेशन कोड को आंशिक रूप से/पूरी तरह से फिर से लिखना पड़ सकता है, लेकिन यह आप पर निर्भर है कि आप वास्तव में चीजों को बेहतर तरीके से काम करना चाहते हैं।
आइए डेटाबेस संरचना को ठीक करके शुरू करें। इसे देखकर, आप फेसबुक के न्यूजफीड के समान एक एप्लीकेशन कर रहे हैं। इस मामले में, FOREIGN KEYS
का उपयोग कर रहे हैं बहुत अधिक अनिवार्य है ताकि आप कुछ डेटा स्थिरता की गारंटी दे सकें। नीचे दिया गया उदाहरण डेटाबेस स्कीमा दिखाता है कि आप इसे कैसे प्राप्त कर सकते हैं।
-- Application users are stored here.
CREATE TABLE users (
user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(255),
last_name VARCHAR(255),
profile_name VARCHAR(255)
) ENGINE=InnoDb;
-- User friendship relations go here
CREATE TABLE friends (
friend_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
profile_one INT NOT NULL,
profile_two INT NOT NULL,
FOREIGN KEY (profile_one) REFERENCES users (user_id),
FOREIGN KEY (profile_two) REFERENCES users (user_id)
) ENGINE=InnoDb;
-- User status updates go here
-- This is what will be displayed on the "newsfeed"
CREATE TABLE statuses (
status_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
author_id INT NOT NULL,
recipient_id INT NOT NULL,
message TEXT,
-- created date ?
-- last updated date ?
FOREIGN KEY (author_id) REFERENCES users (user_id),
FOREIGN KEY (recipient_id) REFERENCES users (user_id)
) ENGINE=InnoDb;
-- Replies to user statuses go here. (facebook style..)
-- This will be displayed as the response of a user to a certain status
-- regardless of the status's author.
CREATE TABLE replies (
reply_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
status_id INT NOT NULL,
author_id INT NOT NULL,
message TEXT,
FOREIGN KEY (status_id) REFERENCES statuses (status_id),
FOREIGN KEY (author_id) REFERENCES users (user_id)
) ENGINE=InnoDb;
अब जबकि यह ठीक हो गया है, हम अगले चरण के साथ आगे बढ़ सकते हैं - john123
के लिए न्यूज़फ़ीड का चयन करना (जिसके पास user_id=1
है ) इसे नीचे दी गई क्वेरी से हासिल किया जा सकता है:
SET @search_id:=1; -- this variable contains the currently logged in user_id so that we don't need to replace the value more than once in the whole query.
SELECT
statuses.*,
author.first_name AS author_first_name,
author.last_name AS author_last_name,
recipient.first_name AS recipient_first_name,
recipient.last_name AS recipient_last_name
FROM statuses
JOIN users AS author ON author.user_id = statuses.author_id
JOIN users AS recipient ON recipient.user_id = statuses.recipient_id
WHERE (statuses.author_id = @search_id OR statuses.recipient_id = @search_id)
ORDER BY status_id ASC
और यहां
आप इसे एक sqlfiddle में क्रिया में देख सकते हैं। जैसा कि आप देख सकते हैं, डेटाबेस को बेहतर ढंग से संरचित करके, मैंने एक उप-क्वेरी की आवश्यकता को समाप्त कर दिया है (जो कि EXISTS / NOT EXISTS
है। दस्तावेज़ोंके अनुसार करें ए> और EXPLAIN
) इसके अलावा उपरोक्त SQL कोड को बनाए रखना और विस्तारित करना बहुत आसान होगा।
वैसे भी, मुझे आशा है कि आपको यह उपयोगी लगेगा।