Войти

Показать полную графическую версию : Mysql Выбор записей + к каждой count из другой таблицы


benya
25-05-2006, 16:41
Господа, помогите построить запрос!

Есть таблица с фотографиями:
jpg

id,jpg,opis

Есть вторая таблица с комментами пользователей:
jpg_comm

id,id_jpg,comment


Для того, что бы пришивать к фото комментарии пользователей, добавляется комментарий и в ячейку id_jpg кладется номер id таблицы jpg, тоесть на id какой фотографии ссылаемся.
Нужно.
Выбрать фотографии + подсчитать количество коментариев к фото. (естественно в одном запросе)

Я делаю так:

SELECT jpg.id,jpg,opis,count(*) AS count FROM `jpg`,`jpg_comm` WHERE jpg_comm.id_jpg = jpg.id GROUP BY jpg.jpg
Но в этом случае выбираются только фотографии у которых есть комментарий (есть записи ссылающиеся с таблицы jpg_comm)
Записи на которые не ссылок нет - не выбираются ;(
Как же построить запрос что бы выбирались все записи + если у фото нет комментария в поле count проставить 0,либо пкстое либо NULL?

Vlad Drakula
25-05-2006, 17:04
benya
знаю как это сделать в оракл(даже несколькими способами)

рекомендации по воплащению в MySQL:
просто завести еще одно поле в таблице jpg в котом будет хранится колличество коментариев... работать будет на порядок быстрее!

benya
25-05-2006, 17:15
Vlad Drakula,
1)Ну, кидай, может идею споймаю.
2)Вобщем-то да, интересная идея. Только как ячейки обновлять?? Раз за какое-то время?

mar
25-05-2006, 17:32
benya
Только как ячейки обновлять?? Раз за какое-то время?
обновлять при занесения комментария, естественно. (В нормальных СУБД этим занимался бы триггер - при занесения комментария в таблицу комментариев, обновлял бы поле счетчика, а так придется доп. зпросом, но все равно лучше избыточное поле, - работать select будет быстрее )

benya
25-05-2006, 20:29
mar,
У меня еще должны кроме этих быть данные о среднем рейтинге фотографии.
Похоже так оно и прийдется сделать. Делать count для каждой фотки (комменты + рейтинг) тяжеловато будет.

Кстати, никто не подскажет оптимальную структуру для хранения голосов.
Предполагается оценивание фото по 5 бальной шкале. Пользователю, который проголосовал, какое-то время голосовать запрещено.
Писать их строками или опять таблицу добавить в jpg с типом text и записывать туда что-то типа 5&4&2&1&4&2&2 ... а потом считать среднее... Ну тоесть с разделителями.

mar
25-05-2006, 20:38
можно сделать табличку для голосования, что-то типа:
img_id int(11) not null,
user_id int(11) not null,
score int(11) not null,
+ если нужно, время голосования и что-там еще Вам может понадобится?
(это для записи результатов и проверки, голосовал ли человек, или когда он голосовал и показа результатов, если это не анонимно)
и, по аналогии с предыдущим вариантом, вводим избыточность, т.е. при занесении голоса, меняем данные соответствующего поле (расчета среднего) в jpg. Тогда все про рисунок узнаете очень быстро.

benya
25-05-2006, 21:32
mar,
А если user то нету. Голосование анонимное. Я думаю, како-то может быть отголосовавшего запретить по ip на несколько часов?

mar
25-05-2006, 21:55
benya
тогда session_id (например). ip - тоже можно, но надо учитывать, что целые районы, или небольшие городки могут светиться под одним ip, поскольку сидят, скажем, за одним proxy

benya
25-05-2006, 22:14
mar,
Кстати, написал апдейт для таблицы с голосами:

UPDATE `jpg` SET avg_vote = (SELECT AVG(vote) from jpg_vote GROUP BY id_jpg) WHERE id=1

Правда пока не учитывает не даты не ip (или session_id). Не додумался.

vadimiron
26-05-2006, 03:15
benya
Мщжно также без новых столбцов с помощью UNION ппробывать сделать
Просто объеденить запрос фоток с комментарями с запросом фоток вообще без комментариев (и вместо count(*) поставить просто 0)

Vlad Drakula
26-05-2006, 10:44
benya
Ну, кидай, может идею споймаю. кинуть то я могу, но смысле никакого... все навно MySQL версии 4.* этого не поддерживает...

vadimiron
Мщжно также без новых столбцов с помощью UNION ппробывать сделать
Просто объеденить запрос фоток с комментарями с запросом фоток вообще без комментариев (и вместо count(*) поставить просто 0)
интересная идея... но все равно зранить дополнительное поле это более экономичное решение...

vadimiron
26-05-2006, 18:27
интересная идея... но все равно зранить дополнительное поле это более экономичное решение...
Не спорю: приходится всегда выбирать либо чуть больше данных хранить, либо больше процессорного времени занимать




© OSzone.net 2001-2012