SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 09.10.2013 22:13:15

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

Четырех табличный запрос

Здравствуйте, у меня такая задача:

есть 4-е таблицы
type - с категориями
images - (один ко многим) тут допустим хранятся пути до картинок и описание
posts - с названиями постов
comment - комментарии


Не знаю как вывести, списком, вроде этого:

id  title  text  postCount  type  commentCount
1   ttt    xxx  7                3      23


Сделал что то вроде того:

SELECT p.title, i.text, COUNT(i.id) AS postCount, t.type, COUNT(c.post) AS commentCount  FROM `type` t, `images` i, `posts` p LEFT JOIN comment c ON p.id=c.post WHERE t.id = p.type AND i.id = p.id AND p.status ='on'  GROUP BY i.id ORDER BY p.date DESC LIMIT 0,20



Однако из за  LEFT JOIN неправильно считаются количество картинок и комментариев

Отредактированно Марк (09.10.2013 22:19:05)

Неактивен

 

#2 09.10.2013 22:26:16

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Четырех табличный запрос

Здравствуйте.

В запросе Вы считаете COUNT(h.id), то есть количество постов.
Одновременно пытаетесь вывести текст поста (в выборке присутствует h.text). 
Напрямую это невозможно - ибо нельзя получить в одном запросе и скалярную величину (количество постов), и их тексты.
Так что определитесь - хотите получить просто количество постов и комментариев в категории (в этом случае в таблицу humor_meta мы и не будем обращаться) - это делается через двойную группировку или же тексты постов тоже нужны в результате?

И приведите пожалуйста структуру таблиц и тестовые данные в sql-форме  (как здесь).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 09.10.2013 22:38:58

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

Re: Четырех табличный запрос

Мне необходимо вывести посты с названиями, кол-вом постов, категорией и одной записью из таблицы humor (так как таблица humor_meta имеет связь с таблицей humor один ко многим) и еще кол-во комментариев к постам.
Я переименовал таблицы для понятности, вот как они сейчас есть в базе



--
-- Структура таблицы `comment`
--

CREATE TABLE IF NOT EXISTS `comment` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `post` int(10) unsigned NOT NULL COMMENT 'Пост которому принадлежит запись',
  `name` varchar(55) NOT NULL,
  `email` varchar(128) NOT NULL,
  `comment` text NOT NULL,
  `created` datetime NOT NULL,
  `score` int(11) NOT NULL DEFAULT '0' COMMENT 'Голоса',
  `status` enum('hide','show','black') NOT NULL DEFAULT 'hide',
  PRIMARY KEY (`id`),
  KEY `created` (`created`),
  KEY `status` (`status`),
  KEY `post` (`post`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=166 ;

-- --------------------------------------------------------

--
-- Структура таблицы `humor`
--

CREATE TABLE IF NOT EXISTS `humor` (
  `gid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id` int(10) unsigned NOT NULL,
  `sort` int(10) unsigned NOT NULL DEFAULT '0',
  `name` varchar(30) NOT NULL DEFAULT '',
  `email` varchar(40) NOT NULL DEFAULT '',
  `text` text NOT NULL,
  `image` varchar(255) DEFAULT NULL,
  `img` varchar(255) DEFAULT NULL COMMENT 'Изображение с метаописанием',
  `alt` varchar(255) NOT NULL DEFAULT '' COMMENT 'Описание картинки',
  `score` int(11) NOT NULL DEFAULT '0' COMMENT 'Рейтинг',
  `status` enum('on','off') NOT NULL DEFAULT 'off' COMMENT 'Включен/выключен',
  `date` timestamp NOT NULL DEFAULT '2013-09-26 15:56:47' ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`gid`),
  KEY `email` (`email`),
  KEY `score` (`score`),
  KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3219 ;

-- --------------------------------------------------------

--
-- Структура таблицы `humor_meta`
--

CREATE TABLE IF NOT EXISTS `humor_meta` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(55) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  `title` varchar(255) NOT NULL DEFAULT '',
  `score` int(11) NOT NULL DEFAULT '0',
  `date` datetime NOT NULL,
  `type_int` int(10) unsigned NOT NULL DEFAULT '1',
  `status` enum('on','off','del') NOT NULL DEFAULT 'off',
  `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `score` (`score`,`date`),
  KEY `status` (`status`),
  KEY `type2` (`type_int`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2840 ;

-- --------------------------------------------------------

--
-- Структура таблицы `type`
--

CREATE TABLE IF NOT EXISTS `type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent` int(10) unsigned NOT NULL DEFAULT '0',
  `weight` int(11) NOT NULL DEFAULT '0',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_czech_ci DEFAULT NULL,
  `name_alias` varchar(255) NOT NULL DEFAULT '',
  `hurl` varchar(255) DEFAULT NULL,
  `title` varchar(255) NOT NULL DEFAULT '',
  `body` text NOT NULL COMMENT 'Описание раздела',
  `advt` text NOT NULL COMMENT 'Анонс',
  `description` text NOT NULL COMMENT 'Описание страницы',
  `keywords` varchar(255) NOT NULL DEFAULT '' COMMENT 'Ключевые слова',
  `edit` enum('on','off') NOT NULL DEFAULT 'on',
  PRIMARY KEY (`id`),
  UNIQUE KEY `hurl` (`hurl`),
  KEY `parent` (`parent`),
  KEY `type` (`edit`),
  KEY `weight` (`weight`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;
 

Отредактированно Марк (09.10.2013 22:40:41)

Неактивен

 

#4 10.10.2013 00:01:58

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

Re: Четырех табличный запрос

Правильно ли я понимаю, что посты это `humor_meta`?
Для каждого поста вы хотите вывести кол-во комментариев, категорию, кол-во постов в этой категории и какую-то (произвольную) запись из `humor`?

Неактивен

 

#5 10.10.2013 00:22:25

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

Re: Четырех табличный запрос

vasya написал:

Правильно ли я понимаю, что посты это `humor_meta`?
Для каждого поста вы хотите вывести кол-во комментариев, категорию, кол-во постов в этой категории и какую-то (произвольную) запись из `humor`?

Не совсем так, пример:

humor_meta
--------------------------------------
id     title           type
23    название   6


humor
--------------------------------------
gid  id     image
1     23    img1.jpg
2     23    img2.jpg
3     23    img3.jpg


type
--------------------------------------
id   title
6    Картинки


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


А вывести вот так:

id    title               image       type    imageCount     commentCount
1     название      img1.jpg    6        3                      2


Не знаю почему сразу так не показал, запутал наверное вас...

Неактивен

 

#6 10.10.2013 00:48:44

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

Re: Четырех табличный запрос

select p.id, p.title, p.`type_int`, (select count(*) from `humor` i where p.id=i.id) as imageCount,
(select count(*) from `comment` c where p.id=c.post) as postCount from `humor_meta` p;

Неактивен

 

#7 10.10.2013 11:51:41

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

Re: Четырех табличный запрос

vasya написал:

select p.id, p.title, p.`type_int`, (select count(*) from `humor` i where p.id=i.id) as imageCount,
(select count(*) from `comment` c where p.id=c.post) as postCount from `humor_meta` p;

Спасибо большое, сделал немножко по другому, потому как необходимо вывести первое изображение из  humor

SELECT p.*, t.`name` AS type_name, COUNT(i.id) AS imageCount,  i.image, (SELECT COUNT(*) FROM `comment` c WHERE p.id = c.post) AS commentCount FROM  `humor_meta` p, `humor`i, `type2` t WHERE p.id=i.id AND p.`type_int`=t.id GROUP BY i.id ORDER BY `p`.`id` DESC LIMIT 0 , 30

Неактивен

 

Board footer

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