- Селектиране на записи спрямо друга таблица?
WT форуми -> PHP MySQL ASP.NET -> Селектиране на записи спрямо друга таблица?
Създайте нова тема Напишете отговор 
Автор Съобщение
streleca_stz
Турист
Турист

Регистриран на: 13/07/2009 12:30 am

Support: 6
Bonus: 12
Мнения: 486
Мнение 31/08/2017 5:00 pm     Селектиране на записи спрямо друга таблица? Отговорете с цитат


Привет, имам проблем със заявката си - това, което се опитвам да направя, е да селектирам четирите записа с най-добър положителен вот (специфично за моя казус е такава ситуацията).
Стигнах го тук, но така и не иска да ми покаже правилните данни:
SQL code:
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"
Реално заявката минава и ми показва резултати, но каунтърите не отчитат правилно - за примера прибавих към въпросните вотове 2 за 1 запис, и 1 за друг запис и ми изкарва, че записът с 2 вота има реално 4, което не е правилно в случая....
Ще се радвам ако някой може да удари едно рамо! Question
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Revelation
Турист
Турист

Регистриран на: 24/03/2013 3:23 pm

Support: 40
Bonus: 80
Мнения: 563
Мнение 31/08/2017 5:31 pm      Отговорете с цитат


Така не мога да си представя какво се случва, но може да пробваш с COUNT(DISTINCT ...) as ...

Ако не, дай и един sqlfiddle с пример, защото така е трудно да се разбере какво се случва.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
streleca_stz
Турист
Турист

Регистриран на: 13/07/2009 12:30 am

Support: 6
Bonus: 12
Мнения: 486
Мнение 31/08/2017 6:02 pm      Отговорете с цитат


Понеже SQLFiddle така и не иска да сработи при мен (не ми билдва схемата) ще пусна тук примерините таблици, за да вникнеш малко повече в проблема ми:
SQL code:
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;
Самата заявка пробвах на всички COUNT да му плясна по един DISTINCT, но не се получи...
SQL code:
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"
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
n641951363
Нов
Нов

Регистриран на: 29/08/2017 2:35 pm

Support: 3
Bonus: 6
Мнения: 32
Мнение 01/09/2017 8:14 am      Отговорете с цитат


не си ни дал таблицата "rows_comms".
Сигурен ли си че таблицата "rows" има само една колона ?
Ако е така то реално тя не ти е нужна за нищо
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
joTunkiq
Активен
Активен

Регистриран на: 25/12/2012 12:03 pm

Support: 127
Bonus: 254
Мнения: 769
Мнение 01/09/2017 5:22 pm      Отговорете с цитат


Не съм сигурен какво има в тази ROWS таблица, предполагам там си записваш коментарите или каквото оценяш.

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

SQL code:
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


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

Idea Question

п.с: земи тоя фидъл да си пробваш : http://sqlfiddle.com/#!9/fa1594/20 Very Happy
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
Страница 1 от 1


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети