एक कच्चे एसक्यूएल समाधान के लिए User
और Voting
मॉडल users
और voting
टेबल मिलान कर रहे हैं, आप, मैं पर ideone here
डेटा सेटअप आपकी समस्या का एक मोटा प्रतिकृति बना लिया है:
create table content_a(id int, user_id int, content varchar(20));
create table content_b(id int, user_id int, content varchar(20));
create table content_c(id int, user_id int, content varchar(20));
create table voting(user_id int, content_id int, content_type_id int, vote int);
create table users(id int, name varchar(20));
insert into content_a values(1,1,'aaaa');
insert into content_a values(2,1,'bbbb');
insert into content_a values(3,1,'cccc');
insert into content_b values(1,2,'dddd');
insert into content_b values(2,2,'eeee');
insert into content_b values(3,2,'ffff');
insert into content_c values(1,1,'gggg');
insert into content_c values(2,2,'hhhh');
insert into content_c values(3,3,'iiii');
insert into users values(1, 'first');
insert into users values(2, 'second');
insert into users values(3, 'third');
insert into users values(4, 'voteonly');
-- user 1 net votes (2)
insert into voting values (1, 1, 1, 1);
insert into voting values (2, 3, 1, -1);
insert into voting values (3, 1, 1, 1);
insert into voting values (4, 2, 1, 1);
-- user 2 net votes (3)
insert into voting values (1, 2, 2, 1);
insert into voting values (1, 1, 2, 1);
insert into voting values (2, 3, 2, -1);
insert into voting values (4, 2, 2, 1);
insert into voting values (4, 2, 3, 1);
-- user 3 net votes (-1)
insert into voting values (2, 3, 3, -1);
मैंने मूल रूप से माना है कि content_a के पास 1 प्रकार है, content_b का एक प्रकार है 2 और content_c का एक प्रकार है 3. कच्चे एसक्यूएल का उपयोग करके, टी लगता है स्पष्ट दृष्टिकोण। सबसे पहले सभी सामग्री को एक साथ जोड़ना है, फिर उपयोगकर्ताओं और मतदान तालिकाओं के साथ इसमें शामिल होना। मैंने नीचे इस दृष्टिकोण का परीक्षण किया है।
select users.*, sum(voting.vote)
from users,
voting, (
SELECT id, 1 AS content_type_id, user_id
FROM content_a
UNION
SELECT id, 2 AS content_type_id, user_id
FROM content_b
UNION
SELECT id, 3 AS content_type_id, user_id
FROM content_c) contents
where contents.user_id = users.id
and voting.content_id = contents.id
and voting.content_type_id = contents.content_type_id
group by users.id
order by sum(voting.vote) desc;
वैकल्पिक विकल्प यूनियन चरण के बिना मतदान तालिका में सामग्री तालिकाओं में शामिल होने के लिए प्रतीत होता है। यह अधिक प्रदर्शनकारी हो सकता है, लेकिन मैं इसका परीक्षण करने में सक्षम नहीं हूं क्योंकि विजुअल स्टूडियो मेरे लिए मेरे एसक्यूएल को फिर से लिखता रहता है ... मुझे उम्मीद है कि एसक्यूएल इस तरह कुछ दिखने की उम्मीद करेगा (लेकिन मैंने इसका परीक्षण नहीं किया है):
select users.*, sum(voting.vote)
from users, voting, content_a, content_b, content_c
where users.id = content_a.user_id (+)
and users.id = content_b.user_id (+)
and users.id = content_c.user_id (+)
and ((content_a.id = voting.content_id and voting.content_type_id = 1) OR
(content_b.id = voting.content_id and voting.content_type_id = 2) OR
(content_c.id = voting.content_id and voting.content_type_id = 3))
group by users.id
order by sum(voting.vote) desc;
अपनी 'मतदान' तालिका में वोट देने के बाद, आप यह बता सकते हैं कि यह किस सामग्री तालिका से संबंधित है? यदि एक से अधिक तालिका में 'content_id' मौजूद है तो क्या होगा? – eggyal
मैं क्षमा चाहता हूं, मैं एक कॉलम शामिल करना भूल गया। – mburke13