свързани таблици....

15 отговора 586 прегледа
#1

свързани таблици....

имам три таблици....една главна и две свързани та проблема ми е как да преброя записите в една свързана таблица а в друга да сумирам стойностите в едно поле, но без подзаявки....
за MySql 3.23.58 става дума...

[линк]

Редактирано от Topбaлaн на

Отговор
в отговор на Topбaлaн #2

Re: свързани таблици....

дай някакъв пример, че не те разбрах точно какво искаш да направиш ...

Отговор
в отговор на Topбaлaн #3

Re: свързани таблици....

Нещо не загрях, какво искаш да направиш. Дай някакъв пример!

General Protection Fault in module 0xDEEBAA. Рестартирайте държавата!
Отговор
в отговор на Topбaлaн #4

пример

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

нещо подобно да речем.....

Отговор
в отговор на torbalan #5

Re: пример ли?

Ами какво ти пречи да го направиш?

salle.online.bg/sig
Отговор
в отговор на torbalan #6

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. Рестартирайте държавата!
Отговор
в отговор на torbalan #7

Re: пример

мисля че не може да стане в една заявка (без да изполваш 2 вюта за резултатите или без вложени заявки)
ако беше само да ги пребройш Ок. с distinct по ключа в подчинените табици
ама за сумата незнам
sale изглежда като че ли има решение
ако му е възможно да го post-не :)

Отговор
в отговор на torbalan #8

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

Отговор
в отговор на AcidMemory #9

и за 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


[линк]

Редактирано от Topбaлaн на

Отговор
в отговор на Topбaлaн #10

Re: и за sale

??? нещо си в грешка, бе човек

не може да ти се повтарят записи, след като left join-ваш по таблицата ...

постни данни от таблицата да видим - нещо не правиш както трябва или не те разбирам, но заявката (която ти написах) вади за всяка картинка сумата от оценките и сумата от коментарите към нея (принципно ще ти е по-полезно avg(от оценките), щото сумата няма какво да я правиш)

Отговор
в отговор на Topбaлaн #11

Re: и за sale

определено това няма начин да работи както трябва
просто cartesian product-а от джойновете съдържа мултиплицирани редовете от двете свързани таблици

ако държиш да стане с една заявка пробвай да промениш структурата на таблиците - да обединиш двете свързани таблици или си направи заявките с темпова таблица

Отговор
в отговор на Topбaлaн #13

мдам, разбрах какво ти трябва, ето ...

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 няма да стане)

Отговор
в отговор на AcidMemory #14

и сумата става...

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

Отговор
в отговор на зъл oйлюфф #15

Re: и сумата става...

абе да, става, ама трябва да се напише с еквивалента на decode от Оракъла в MySQL (иначе като е 0 сумата, става кофти) ...

Отговор
в отговор на AcidMemory #16

Re: мдам, разбрах какво ти трябва, ето ...

доколкото оценките е само една - харесвами (в базата 1) средното аритметично ще е винаги 1
тъй, че или брой гласували или сума - в крайна сметка все тая...

[линк]
Отговор