свързани таблици....
15 отговора
586 прегледа
свързани таблици....
имам три таблици....една главна и две свързани та проблема ми е как да преброя записите в една свързана таблица а в друга да сумирам стойностите в едно поле, но без подзаявки....
за MySql 3.23.58 става дума...
[линк]
за MySql 3.23.58 става дума...
[линк]
Редактирано от Topбaлaн на
Re: свързани таблици....
дай някакъв пример, че не те разбрах точно какво искаш да направиш ...
Re: свързани таблици....
Нещо не загрях, какво искаш да направиш. Дай някакъв пример!
General Protection Fault in module 0xDEEBAA. Рестартирайте държавата!
General Protection Fault in module 0xDEEBAA. Рестартирайте държавата!
пример
SELECT memberpics.pic_name AS 'Заглавие',
________COUNT(comments.fromdate) AS 'Коментари',
________SUM(votes.vote) AS 'Точки',
FROM memberpics
________LEFT JOIN comments ON (memberpics.pic_id = comments.pic_id)
________LEFT JOIN votes ON (memberpics.pic_id = votes.pic_id)
GROUP BY memberpics.pic_id
ORDER BY memberpics.pic_id DESC
LIMIT 10
нещо подобно да речем.....
________COUNT(comments.fromdate) AS 'Коментари',
________SUM(votes.vote) AS 'Точки',
FROM memberpics
________LEFT JOIN comments ON (memberpics.pic_id = comments.pic_id)
________LEFT JOIN votes ON (memberpics.pic_id = votes.pic_id)
GROUP BY memberpics.pic_id
ORDER BY memberpics.pic_id DESC
LIMIT 10
нещо подобно да речем.....
Re: пример
защо искаш да набуташ всичко в едно запитване? направи си 2 помощни views и действай.
Ако много държиш да е в едно view то използвай nested selects. само, че не знам MySQL доколко е развит за такива работки. В Oracle бих написал нещо такова:
SELECT memberpics.pic_name AS 'Заглавие', memberpics.pic_id as picture_id,
(SELECT COUNT(comments.fromdate) FROM comments GROUP BY comments.pic_id HAVING comments.pic_id=picture_id ) AS 'Коментари',
(SELECT SUM(votes.vote) FROM votes GROUP BY votes.pic_id HAVING votes.pic_id=picture_id) AS 'Точки'ORDER BY memberpics.pic_id DESC
LIMIT 10
тук picture_id ти е нещо като global variable, който се автоподава като параметър в вътрешните запитвания...
... абе нещо такова - не казвам, че това, което съм написал е баш как-требе!
General Protection Fault in module 0xDEEBAA. Рестартирайте държавата!
Ако много държиш да е в едно view то използвай nested selects. само, че не знам MySQL доколко е развит за такива работки. В Oracle бих написал нещо такова:
SELECT memberpics.pic_name AS 'Заглавие', memberpics.pic_id as picture_id,
(SELECT COUNT(comments.fromdate) FROM comments GROUP BY comments.pic_id HAVING comments.pic_id=picture_id ) AS 'Коментари',
(SELECT SUM(votes.vote) FROM votes GROUP BY votes.pic_id HAVING votes.pic_id=picture_id) AS 'Точки'ORDER BY memberpics.pic_id DESC
LIMIT 10
тук picture_id ти е нещо като global variable, който се автоподава като параметър в вътрешните запитвания...
... абе нещо такова - не казвам, че това, което съм написал е баш как-требе!
General Protection Fault in module 0xDEEBAA. Рестартирайте държавата!
Re: пример
мисля че не може да стане в една заявка (без да изполваш 2 вюта за резултатите или без вложени заявки)
ако беше само да ги пребройш Ок. с distinct по ключа в подчинените табици
ама за сумата незнам
sale изглежда като че ли има решение
ако му е възможно да го post-не :)
ако беше само да ги пребройш Ок. с distinct по ключа в подчинените табици
ама за сумата незнам
sale изглежда като че ли има решение
ако му е възможно да го post-не :)
Re: пример
а какво и има на заявката ???
тука набързо я нахвърлих същата към една инсталация на phpbb и си бачка като пушка ...
select a.pic_id, a.pic_title, count(ac.comment_id), sum(ar.rate_point)
from phpbb_album a
left join phpbb_album_comment ac on (a.pic_id = ac.comment_pic_id)
left join phpbb_album_rate ar on (a.pic_id = ar.rate_pic_id)
group by a.pic_id
order by a.pic_id desc
limit 10
тука набързо я нахвърлих същата към една инсталация на phpbb и си бачка като пушка ...
select a.pic_id, a.pic_title, count(ac.comment_id), sum(ar.rate_point)
from phpbb_album a
left join phpbb_album_comment ac on (a.pic_id = ac.comment_pic_id)
left join phpbb_album_rate ar on (a.pic_id = ar.rate_pic_id)
group by a.pic_id
order by a.pic_id desc
limit 10
и за sale
ами не работи както аз искам...
има две свързани записи и съответно повече редове в отговора отколкото на мен ми трябват
и сбора от оценките и броя на коментарите в резултата не са верни...
нещо от този род ми трябва:
SELECT memberpics.pic_name AS 'Заглавие', memberpics.pic_id as picture_id,
(SELECT COUNT(comments.fromdate) FROM comments GROUP BY comments.pic_id HAVING comments.pic_id=picture_id ) AS 'Коментари',
(SELECT SUM(votes.vote) FROM votes GROUP BY votes.pic_id HAVING votes.pic_id=picture_id) AS 'Точки'ORDER BY memberpics.pic_id DESC
[линк]
има две свързани записи и съответно повече редове в отговора отколкото на мен ми трябват
и сбора от оценките и броя на коментарите в резултата не са верни...
нещо от този род ми трябва:
SELECT memberpics.pic_name AS 'Заглавие', memberpics.pic_id as picture_id,
(SELECT COUNT(comments.fromdate) FROM comments GROUP BY comments.pic_id HAVING comments.pic_id=picture_id ) AS 'Коментари',
(SELECT SUM(votes.vote) FROM votes GROUP BY votes.pic_id HAVING votes.pic_id=picture_id) AS 'Точки'ORDER BY memberpics.pic_id DESC
[линк]
Редактирано от Topбaлaн на
Re: и за sale
??? нещо си в грешка, бе човек
не може да ти се повтарят записи, след като left join-ваш по таблицата ...
постни данни от таблицата да видим - нещо не правиш както трябва или не те разбирам, но заявката (която ти написах) вади за всяка картинка сумата от оценките и сумата от коментарите към нея (принципно ще ти е по-полезно avg(от оценките), щото сумата няма какво да я правиш)
не може да ти се повтарят записи, след като left join-ваш по таблицата ...
постни данни от таблицата да видим - нещо не правиш както трябва или не те разбирам, но заявката (която ти написах) вади за всяка картинка сумата от оценките и сумата от коментарите към нея (принципно ще ти е по-полезно avg(от оценките), щото сумата няма какво да я правиш)
Re: и за sale
определено това няма начин да работи както трябва
просто cartesian product-а от джойновете съдържа мултиплицирани редовете от двете свързани таблици
ако държиш да стане с една заявка пробвай да промениш структурата на таблиците - да обединиш двете свързани таблици или си направи заявките с темпова таблица
просто cartesian product-а от джойновете съдържа мултиплицирани редовете от двете свързани таблици
ако държиш да стане с една заявка пробвай да промениш структурата на таблиците - да обединиш двете свързани таблици или си направи заявките с темпова таблица
мдам, разбрах какво ти трябва, ето ...
SELECT a.pic_id, a.pic_title, avg(ar.rate_point ), count(DISTINCT ac.comment_id )
FROM phpbb_album a
LEFT JOIN phpbb_album_comment ac ON ( a.pic_id = ac.comment_pic_id )
LEFT JOIN phpbb_album_rate ar ON ( a.pic_id = ar.rate_pic_id )
GROUP BY a.pic_id
ORDER BY a.pic_id DESC
LIMIT 10
мдам, моя грешка - не разбрах в началото и се подведох, признавам - но ето ти решение с една заявка (надявам се, че ти трябва avg-to от оценката, иначе за сумата просто в MySQL няма да стане)
FROM phpbb_album a
LEFT JOIN phpbb_album_comment ac ON ( a.pic_id = ac.comment_pic_id )
LEFT JOIN phpbb_album_rate ar ON ( a.pic_id = ar.rate_pic_id )
GROUP BY a.pic_id
ORDER BY a.pic_id DESC
LIMIT 10
мдам, моя грешка - не разбрах в началото и се подведох, признавам - но ето ти решение с една заявка (надявам се, че ти трябва avg-to от оценката, иначе за сумата просто в MySQL няма да стане)
и сумата става...
SELECT
m.pic_id,
m.pic_name,
COUNT(DISTINCT(c.fromdate)),
SUM(v.vote) / COUNT(DISTINCT(c.fromdate))
FROM memberpics m, comments c, votes v
WHERE
m.pic_id = c.pic_id
AND m.pic_id = v.pic_id
GROUP BY m.pic_id
m.pic_id,
m.pic_name,
COUNT(DISTINCT(c.fromdate)),
SUM(v.vote) / COUNT(DISTINCT(c.fromdate))
FROM memberpics m, comments c, votes v
WHERE
m.pic_id = c.pic_id
AND m.pic_id = v.pic_id
GROUP BY m.pic_id
Re: и сумата става...
абе да, става, ама трябва да се напише с еквивалента на decode от Оракъла в MySQL (иначе като е 0 сумата, става кофти) ...
Re: мдам, разбрах какво ти трябва, ето ...
доколкото оценките е само една - харесвами (в базата 1) средното аритметично ще е винаги 1
тъй, че или брой гласували или сума - в крайна сметка все тая...
[линк]
тъй, че или брой гласували или сума - в крайна сметка все тая...
[линк]