Селектиране на записи спрямо друга таблица?

streleca_stz

Registered
Привет, имам проблем със заявката си - това, което се опитвам да направя, е да селектирам четирите записа с най-добър положителен вот (специфично за моя казус е такава ситуацията).
Стигнах го тук, но така и не иска да ми покаже правилните данни:
[sql]SELECT r.*, COUNT(c.comm_id) as comms, COUNT(u.vote_id) as ups, COUNT(d.vote_id) as downs
FROM rows r
LEFT JOIN rows_comms c ON (c.item_id = r.item_id)
LEFT JOIN votes u ON (u.group_id = r.item_group_id AND u.item_id = r.item_id AND u.vote = 1)
LEFT JOIN votes d ON (d.group_id = r.item_group_id AND d.item_id = r.item_id AND u.vote = 0)
WHERE r.approved = 1
ORDER BY ups DESC LIMIT 4"[/sql]Реално заявката минава и ми показва резултати, но каунтърите не отчитат правилно - за примера прибавих към въпросните вотове 2 за 1 запис, и 1 за друг запис и ми изкарва, че записът с 2 вота има реално 4, което не е правилно в случая....
Ще се радвам ако някой може да удари едно рамо! :?:
 
Така не мога да си представя какво се случва, но може да пробваш с COUNT(DISTINCT ...) as ...

Ако не, дай и един sqlfiddle с пример, защото така е трудно да се разбере какво се случва.
 
Понеже SQLFiddle така и не иска да сработи при мен (не ми билдва схемата) ще пусна тук примерините таблици, за да вникнеш малко повече в проблема ми:
[sql]CREATE TABLE `rows` (
`row_id` int(12) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `rows` (`row_id`) VALUES (1),(2);

ALTER TABLE `rows`
ADD PRIMARY KEY (`row_id`);
ALTER TABLE `rows`
MODIFY `row_id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;COMMIT;

CREATE TABLE `votes` (
`vote_id` int(12) NOT NULL,
`item_id` int(12) NOT NULL,
`user_id` int(12) NOT NULL,
`group_id` tinyint(1) NOT NULL,
`vote` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `votes` (`vote_id`, `item_id`, `user_id`, `group_id`, `vote`) VALUES
(1, 1, 1, 1, 1),
(2, 2, 1, 1, 1),
(4, 1, 2, 1, 0);

ALTER TABLE `votes`
ADD PRIMARY KEY (`vote_id`);

ALTER TABLE `votes`
MODIFY `vote_id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;COMMIT;
[/sql]Самата заявка пробвах на всички COUNT да му плясна по един DISTINCT, но не се получи...[sql]SELECT r.*, COUNT(DISTINCT c.comm_id) as comms, COUNT(DISTINCT u.vote_id) as ups, COUNT(DISTINCT d.vote_id) as downs
FROM rows r
LEFT JOIN rows_comms c ON (c.item_id = r.item_id)
LEFT JOIN votes u ON (u.group_id = r.item_group_id AND u.item_id = r.item_id AND u.vote = 1)
LEFT JOIN votes d ON (d.group_id = r.item_group_id AND d.item_id = r.item_id AND u.vote = 0)
WHERE r.approved = 1
ORDER BY ups DESC LIMIT 4"[/sql]
 
не си ни дал таблицата "rows_comms".
Сигурен ли си че таблицата "rows" има само една колона ?
Ако е така то реално тя не ти е нужна за нищо
 
Не съм сигурен какво има в тази ROWS таблица, предполагам там си записваш коментарите или каквото оценяш.

Мисля, че го измислих.

[sql]SELECT *,
( SELECT count(vote) FROM `votes` WHERE votes.item_id = rows.row_id and votes.vote > 0 ) as votes
FROM `rows` order by votes desc limit 4[/sql]

Пробвай в реална среда и кажи какво става, тъй като малко ми е объркано с тези имена . Btw, само един съвет, именувай си таблиците с истинските имена и да са ясни и точни , защото някой страничен трудно ще ти схване магиите. Дори за самия теб ще е много "яко" ако след 4-5 месеца се наложи да ъпгрейднеш или да обясниш на някой какво си искал да направиш ;д

:idea: :?:

п.с: земи тоя фидъл да си пробваш : http://sqlfiddle.com/#!9/fa1594/20 :D
 

Горе