SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.10.2013 14:33:41

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Здравствуйте, приведу простой вариант своих таблиц, и запрос, он работает но выводит неправильное кол-во изображений.
Структура вроде бы самая обычная, вывод постов с кол-вом комментариев, кол-вом изображений в посте и фильтрацией по тегу, а сами теги я получаю уже вторым запросом, по массиву прогоняю и присваиваю каждому посту. т.е визуально выглядит так:


<h2>пост 1 (2 фото)</h2>
<div>комментариев: 2, теги: картинки, картинки2</div>
<img src="img1.jpg">
<hr>
<h2>пост 2 (1 фото)</h2>
<div>комментариев: 0, теги: картинки</div>
<img src="img3.jpg">


Запрос:
SELECT p.*, COUNT(i.id) AS itemCount, i.image, (SELECT COUNT(*) FROM `comment` c WHERE p.id = c.post) AS commentCount FROM post p, post_item i, tags_link tl WHERE p.id=i.post AND p.id=tl.post  GROUP BY i.post


Структура:
post
--------------------------------------
id     title         
23    пост 1
24    пост 2

post_item
--------------------------------------
id   post     image
1     23     img1.jpg
2     23     img2.jpg
3     24     img3.jpg

tags
--------------------------------------
id   tags
6    картинки
7    картинки2

tags_link
--------------------------------------
tags   post
6       23
7       23
6       24

comment
--------------------------------------
id   post   text
1    23      комментарий
2    23      комментарий2


Помогите пожалуйста с запросом, учитываю что записей будет дофига, 1 лям точно

Отредактированно Марк (21.10.2013 14:36:55)

Неактивен

 

#2 21.10.2013 15:20:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

1) FAQ №16
2) зачем в этом запросе tags_link ?
3) почему не хотите посчитать кол-во изображений через count(*) аналогично комментариям ?

Неактивен

 

#3 21.10.2013 15:41:41

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

vasya написал:

1) FAQ №16
2) зачем в этом запросе tags_link ?
3) почему не хотите посчитать кол-во изображений через count(*) аналогично комментариям ?

В tags_link хранятся связи тегов с постом, а мне необходимо фильтровать результаты запроса по тегу
А вот посчитать кол-во изображений можно, а как вывести поле i.image ?

Неактивен

 

#4 21.10.2013 16:24:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Марк написал:

В tags_link хранятся связи тегов с постом, а мне необходимо фильтровать результаты запроса по тегу

В текущем варианте запроса вы не выбираете ничего из таблицы tags_link


Марк написал:

А вот посчитать кол-во изображений можно, а как вывести поле i.image ?

По какому принципу определяется нужное поле из нескольких картинок?

Неактивен

 

#5 21.10.2013 16:42:01

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Да написал в посте, а в запросе забыл указать.

По какому принципу определяется нужное поле из нескольких картинок?

А вот это я опустил, в таблице post_item есть поле sort по нему, я его ни когда не использовал так как по счастливой случайности всегда подставлялась нужная картинка

Отредактированно Марк (21.10.2013 16:42:46)

Неактивен

 

#6 21.10.2013 17:09:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

ну тогда только FAQ #16
сначала считаете кол-во картинок и нужный sort, затем добавляете все остальное.

Неактивен

 

#7 21.10.2013 20:21:23

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Вроде бы что то получилось, интересно как он с большими обьемами будет справляца)

SELECT p.*, i.itemCount, i.image, img, (SELECT COUNT(*) FROM `comment` c WHERE p.id = c.post) AS commentCount FROM tags_link tl, `post`p JOIN (SELECT post, image, img, COUNT(*) AS itemCount FROM `post_item` GROUP BY post) AS i ON p.id=i.post WHERE p.id=tl.post GROUP BY p.id ORDER BY `p`.`id` DESC

Отредактированно Марк (21.10.2013 20:22:57)

Неактивен

 

#8 21.10.2013 20:36:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Как
SELECT post, image, img, COUNT(*) AS itemCount FROM `post_item` GROUP BY post
сочетается с FAQ #16 ?
image и img у вас будут случайные.
что ткое img?
зачем 2 группировки?

Неактивен

 

#9 21.10.2013 22:08:48

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

vasya написал:

Как
SELECT post, image, img, COUNT(*) AS itemCount FROM `post_item` GROUP BY post
сочетается с FAQ #16 ?
image и img у вас будут случайные.
что ткое img?
зачем 2 группировки?

В post_item еще несколько полей которые необходимо выбрать и среди них есть с типом text  из за этого как в FAQ #16 нужно сравнивать поля друг с другом, мне кажется это будет не очень эффективно в моем случае. А группировку убрал..

Отредактированно Марк (21.10.2013 22:09:57)

Неактивен

 

#10 21.10.2013 22:43:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Марк написал:

В post_item еще несколько полей которые необходимо выбрать и среди них есть с типом text  из за этого как в FAQ #16 нужно сравнивать поля друг с другом, мне кажется это будет не очень эффективно в моем случае.

На примере поясните, что-то у меня есть подозрение, что вы не правильно поняли о чем идет речь.

Неактивен

 

#11 21.10.2013 23:24:22

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

vasya написал:

Марк написал:

В post_item еще несколько полей которые необходимо выбрать и среди них есть с типом text  из за этого как в FAQ #16 нужно сравнивать поля друг с другом, мне кажется это будет не очень эффективно в моем случае.

На примере поясните, что-то у меня есть подозрение, что вы не правильно поняли о чем идет речь.

Ну вот как в примере

SELECT t.`user_id`, t.`post`, t.`time` FROM `test_table` t JOIN
(SELECT `user_id`, max(`time`) as `mtime` FROM `test_table` GROUP BY `user_id`)
as t1 ON t.`user_id`= t1.`user_id` AND t.`time` = t1.`mtime`;

Неактивен

 

#12 21.10.2013 23:32:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Этот пример я же и писал smile И он не подтверждает высказывание, что если нужно выбрать несколько полей типа text, то их нужно сравнивать.

Неактивен

 

#13 22.10.2013 11:52:45

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Хех) а какже тогда этот кусок кода

t.`user_id`= t1.`user_id` AND t.`time` = t1.`mtime`
? наверное можно подругому

Неактивен

 

#14 22.10.2013 13:42:34

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Вот сделал запрос по FAQ #16, по структуре выше, для вывода популярных тегов за неделю с кол-вом поствов которые были добавленны в эти теги за неделю. Посмотрите пожалуйста может можно оптимизировать?
Поле p.date - дата создания поста


SELECT t.id, t.tags, p.date, COUNT(*) as count FROM tags_link tl, tags t, post p JOIN (SELECT * FROM post WHERE date > DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)) AS p2 ON p.id=p2.id AND p.date=p2.date WHERE tl.post=p.id AND t.id=tl.tags AND p.date > DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY) GROUP BY tl.tags

Отредактированно Марк (22.10.2013 13:43:12)

Неактивен

 

#15 22.10.2013 14:37:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Марк написал:

Хех) а какже тогда этот кусок кода

t.`user_id`= t1.`user_id` AND t.`time` = t1.`mtime`
? наверное можно подругому

Этот кусок кода говорит о том, что комбинация (user_id,time) однозначно характеризует строку, а выбирать пи этом можно хоть 20 полей из строки (и сравнивать их естественно не нужно).

Неактивен

 

#16 22.10.2013 14:41:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Марк написал:

Вот сделал запрос по FAQ #16, по структуре выше, для вывода популярных тегов за неделю с кол-вом поствов которые были добавленны в эти теги за неделю. Посмотрите пожалуйста может можно оптимизировать?
Поле p.date - дата создания поста


SELECT t.id, t.tags, p.date, COUNT(*) as count FROM tags_link tl, tags t, post p JOIN (SELECT * FROM post WHERE date > DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)) AS p2 ON p.id=p2.id AND p.date=p2.date WHERE tl.post=p.id AND t.id=tl.tags AND p.date > DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY) GROUP BY tl.tags

А где здесь FAQ #16 ? Вы группируете по tl.tags и выбираете при этом t.id, t.tags, p.date

Неактивен

 

#17 22.10.2013 21:30:54

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

vasya написал:

Марк написал:

Хех) а какже тогда этот кусок кода

t.`user_id`= t1.`user_id` AND t.`time` = t1.`mtime`
? наверное можно подругому

Этот кусок кода говорит о том, что комбинация (user_id,time) однозначно характеризует строку, а выбирать пи этом можно хоть 20 полей из строки (и сравнивать их естественно не нужно).

Насчет этого понял, спасибо, по второму запросу я его не правильно сделал? работает вроде как надо)

Неактивен

 

#18 22.10.2013 23:35:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

Марк написал:

по второму запросу я его не правильно сделал? работает вроде как надо)

1. делает кучу лишних действий (например, зачем там подзапрос?)
2. вроде как надо - это результат "счастливой случайности"

P.S. А с первым вы уже разобрались?

Неактивен

 

#19 23.10.2013 10:54:16

Марк
Активист
Зарегистрирован: 31.05.2010
Сообщений: 157

Re: Трех табличный запрос с подсчетом кол-ва изображений и комментариев

vasya написал:

Марк написал:

по второму запросу я его не правильно сделал? работает вроде как надо)

1. делает кучу лишних действий (например, зачем там подзапрос?)
2. вроде как надо - это результат "счастливой случайности"

P.S. А с первым вы уже разобрались?

1. Да действительно, убрал его (переусердствовал с FAQ №16)
2. Проверил без группировки, кол-во постов в теге за неделю выводит верно
3. С первым решил оставить как есть и не усложнять, потому как "счастливая случайность" на моей сторонеbig_smile и картинки всегда выводятся только первые т.е то что нужно, а если разобраться даже если и не первая попадется это не сильно страшно.

Но если бы вы предложили лучший способ я бы конечно еще поэкспериментировал

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson