Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Сложный SELECT с COUNT() (Дмитрий К.)
Author Message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Aug 04, 2006 11:20 am ()
   Post subject:
Reply with quote


М

Выделено из темы «Какая должна быть допустимой скорость загрузки страници?»,
расположенной в форуме Разное :: PHP (04 Августа 2006, 17:52).
Back to top
View user's profile Send private message
Дмитрий К.
Участник форума



Joined: 07 Sep 2004
Posts: 229
Карма: -24
   поощрить/наказать

Location: Внутренний мир

PostPosted: Fri Aug 04, 2006 11:20 am (спустя 1 секунду; написано за 2 минуты 45 секунд)
   Post subject:
Reply with quote

У меня назрел вопрос по поводу совместного использования SELECT(*) из одной таблицы и SELECT COUNT(*) из другой. Думаю, понятнее будет через код:
Code (any language): скопировать код в буфер обмена
mysql_qw('SELECT firms.*, COUNT(comments.*) FROM firms, comments AS counter WHERE firms.catcode=? AND comments.placeid=? AND comments.place=?', $_GET['code'], $_GET['code'], 'catalog')
Но он выдаёт ошибку синтаксиса. Подскажите, пожалуйста, как решить проблему?
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Fri Aug 04, 2006 12:12 pm (спустя 52 минуты; написано за 2 минуты 33 секунды)
   Post subject:
Reply with quote

Дмитрий К. wrote:
он выдаёт ошибку синтаксиса
Кто «он»?
Какую ошибку?

Если у Вас вопрос по MySQL, то и показывать надо SQL-запрос (уже сгенерённый!), а не php-код генерации запроса.

P.S. И какое отношение Ваш вопрос имеет к данному топику?
Back to top
View user's profile Send private message
Дмитрий К.
Участник форума



Joined: 07 Sep 2004
Posts: 229
Карма: -24
   поощрить/наказать

Location: Внутренний мир

PostPosted: Fri Aug 04, 2006 12:39 pm (спустя 26 минут; написано за 4 минуты 32 секунды)
   Post subject:
Reply with quote

Quote:
Кто «он»?
Код. Точнее попытка его выполнения.
Quote:
Какую ошибку?
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) FROM firms, comments AS counter WHERE firms
Quote:
Если у Вас вопрос по MySQL, то и показывать надо SQL-запрос (уже сгенерённый!), а не php-код генерации запроса.
Code (SQL): скопировать код в буфер обмена
SELECT firms.*, COUNT(comments.*) FROM firms, comments AS counter WHERE firms.catcode=1 AND comments.placeid=1 AND comments.place='catalog'
Quote:
P.S. И какое отношение Ваш вопрос имеет к данному топику?
Ну, если я сделаю множество однотипных запросов в цикле, то оптимальное количество SQL-запросов на страницу будет превышено многократно, в моём случае это приведёт к недопустимой скорости загрузки страницы:) Вышеобозначенным запросом я пытаюсь решить эту проблему.
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Fri Aug 04, 2006 1:10 pm (спустя 30 минут; написано за 1 минуту 42 секунды)
   Post subject:
Reply with quote

Своими словами объясните, как у Вас эти две таблицы связаны при выборке.
Back to top
View user's profile Send private message
Дмитрий К.
Участник форума



Joined: 07 Sep 2004
Posts: 229
Карма: -24
   поощрить/наказать

Location: Внутренний мир

PostPosted: Fri Aug 04, 2006 2:37 pm (спустя 1 час 27 минут; написано за 5 минут 52 секунды)
   Post subject:
Reply with quote

В таблице firms - перечень фирм, в таблице comments - всякие комментарии, в т.ч. по фирмам. Моя задача вывести на страницу перечень фирм, одновременно выводя количество комментариев, приходящихся на каждую фирму. firms.catcode - id фирмы, comments.placeid - он же, предназначен для определения принадлежности комментария к конкретной фирме, comments.place - место сайта, в котором оставлен комментарий (в данном случае в каталоге фирм).
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Aug 04, 2006 3:12 pm (спустя 34 минуты; написано за 36 секунд)
   Post subject:
Reply with quote

Дмитрий К.
а если в COUNT указать конкретное поле из `comments` ?
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Fri Aug 04, 2006 3:26 pm (спустя 14 минут; написано за 6 минут 36 секунд)
   Post subject:
Reply with quote

Дмитрий К., у Вас должно получиться что-то типа:
Code (SQL): скопировать код в буфер обмена
SELECT firms.*,
COUNT(comments.placeid)
FROM firms
LEFT JOIN comments
ON (firms.catcode=comments.placeid AND comments.place='catalog')
GROUP BY firms.catcode
И я всё равно считаю, что этот вопрос тут не в тему.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Aug 04, 2006 3:30 pm (спустя 3 минуты; написано за 2 минуты 6 секунд)
   Post subject:
Reply with quote

bæv
запятая - это синоним INNER JOIN в MySQL . А вот насчет необходимости GROUP BY Вы наверняка правы.
Back to top
View user's profile Send private message
Дмитрий К.
Участник форума



Joined: 07 Sep 2004
Posts: 229
Карма: -24
   поощрить/наказать

Location: Внутренний мир

PostPosted: Fri Aug 04, 2006 4:17 pm (спустя 46 минут; написано за 5 секунд)
   Post subject:
Reply with quote

Quote:
а если в COUNT указать конкретное поле из `comments` ?
Так не работает.
Code (SQL): скопировать код в буфер обмена
SELECT firms.*,
COUNT(comments.placeid)
FROM firms
LEFT JOIN comments
ON (firms.catcode=comments.placeid AND comments.place='catalog')
GROUP BY firms.catcode
Так выдаётся результат, принцип постороения которого я так и не смог понять. Впрочем, в нём для каждой фирмы появился ключ [COUNT(comments.placeid)], который всегда равен 0.
Quote:
И я всё равно считаю, что этот вопрос тут не в тему.
Какие действия с моей стороны смогут изменить эту неловкую ситуацию?:)
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Aug 04, 2006 4:51 pm (спустя 33 минуты; написано за 4 минуты 19 секунд)
   Post subject:
Reply with quote

Дмитрий К.
Имхо, лучше разделить на 2 запроса - по фирмам и что-то вроде
Code (SQL): скопировать код в буфер обмена
SELECT placeid, COUNT({PRIMARY KEY}) FROM comments GROUP BY placeid
либо же думать над GROUP BY дальше (для этого сначала вообще замените COUNT() на comments.*
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Fri Aug 04, 2006 5:29 pm (спустя 38 минут; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

Дмитрий К. wrote:
всегда равен 0
— значит, у Вас взаимоисключающие условия: либо
firms.catcode=comments.placeid,
 либо
comments.place='catalog'

P.S. Я проверял на таблицах со схожей структорой — у меня всё работает.
Back to top
View user's profile Send private message
Дмитрий К.
Участник форума



Joined: 07 Sep 2004
Posts: 229
Карма: -24
   поощрить/наказать

Location: Внутренний мир

PostPosted: Fri Aug 04, 2006 6:47 pm (спустя 1 час 17 минут; написано за 3 секунды)
   Post subject:
Reply with quote

УРРРА! Заработала! bæv, Maus, БОЛЬШОЕ спасибо, очень выручили!

Вопрос решен, тему можно закрыть.
Back to top
View user's profile Send private message
Markus
Участник форума



Joined: 02 Feb 2004
Posts: 210
Карма: 3
   поощрить/наказать


PostPosted: Sun Feb 04, 2007 4:09 pm (спустя 5 месяцев 30 дней 21 час 21 минуту; написано за 2 минуты 11 секунд)
   Post subject:
Reply with quote

Всем доброго времени суток.
Прошу прощения что поднял данную тему.
Воспользовался поиском, но решения не нашел. Тем более что задача схожа с тем что здесь обсуждается.
Итак:Есть три таблицы:

Таблица №1 t1
id|f1|f2|..|..|..
id - уникальный ID записи таблицы

Таблица №1 t2
id|t1_id|f1|f2|..|..
id - уникальный ID записи таблицы
t1_id - то же что и в id таблицы t1

Таблица №1 t3
id|t1_id|t2_id|f2|..|..|..
id - уникальный ID записи таблицы
t1_id - то же что и в id таблицы t1
t2_id - то же что и в id таблицы t2

Нужно выбрать из таблицы t1 все записи с подсчетом кол-ва записей в таблице t2 удовлетворяющих условию `t1`.`id`=`t2`.`t1_id`
и подсчетом записей кол-ва записей в таблице t3 удовлетворяющих условию `t1`.`id`=`t3`.`t2_id`
Пробовал так:
Code (SQL): скопировать код в буфер обмена
SELECT `t1`.`id`,
COUNT(`t2`.`t1_id`),
COUNT(`t3`.`t1_id`)
FROM `t1`
LEFT JOIN `t2` ON `t1`.`id`=`t2`.`t1_id`
LEFT JOIN `t3` ON `t1`.`id`=`t3`.`t1_id`
GROUP BY `t1`.`id`
Вроде работает, но выдает неверные данные.
например:
имеем в t1 3 записи
в t2 одну запись
в t3 две записи с тем же t2_id что и id таблицы t2 и с тем же t1_id что и id таблицы t1

В результате получаем
Code (any language): скопировать код в буфер обмена
t1.id|COUNT(t2.t1_id)|COUNT(t3.t1_id)
1                2                2
2                0                0
Хотя во втором столбце первой строки должно было быть 1
Back to top
View user's profile Send private message
Dark-Demon
Участник форума
Banned


Joined: 04 Feb 2007
Posts: 45
Карма: -3
   поощрить/наказать

Location: spb

PostPosted: Mon Feb 05, 2007 2:57 am (спустя 10 часов 48 минут; написано за 2 минуты 52 секунды)
   Post subject:
Reply with quote

всё правильно, оба каунта выводят одни и те же числа - число строк результата объединения, поэтому тебе нужно пересчитать только уникальные идентификаторы:
Code (SQL): скопировать код в буфер обмена
SELECT `t1`.`id`,
COUNT(DISTINCT `t2`.`id`),
COUNT(DISTINCT `t3`.`id`)
и далее по тексту...
Back to top
View user's profile Send private message
Markus
Участник форума



Joined: 02 Feb 2004
Posts: 210
Карма: 3
   поощрить/наказать


PostPosted: Mon Feb 05, 2007 3:20 pm (спустя 12 часов 22 минуты; написано за 16 секунд)
   Post subject:
Reply with quote

Dark-Demon
Спасибо, все работает!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML