SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 10.09.2009 14:35:45

Mouse
Участник
Зарегистрирован: 01.09.2009
Сообщений: 7

Запрос из нескольких таблиц

Есть 3 таблицы.

CREATE TABLE `Log_site` (
  `site_id` int(11) NOT NULL default '0',
  `view` int(11) NOT NULL default '0',
  `click` int(11) NOT NULL default '0',
  `date` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`block_id`,`date`),
  KEY `site_id` (`site_id`),
  KEY `date` (`date`)
) ENGINE=MyISAM;

CREATE TABLE `Log_site_all` (
  `site_id` int(11) NOT NULL default '0',
  `view` int(11) NOT NULL default '0',
  `click` int(11) NOT NULL default '0',
  `date` date NOT NULL default '0000-00-00',
  KEY `date` (`date`),
  KEY `site_id` (`site_id`)
) ENGINE=MyISAM;

CREATE TABLE `Site` (
  `id` int(11) NOT NULL auto_increment,
  `url` varchar(250) collate utf8_unicode_ci NOT NULL default '',
  `title` varchar(250) collate utf8_unicode_ci NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;


Необходимо для всех записей из таблицы Site выбрать записи из таблицы Log_site соответствующие сегодняшней дате и выбрать записи из таблицы Log_site_all за последние 30 дней.

Пишу запрос:
SELECT s.id,s.url,s.title,SUM(s1.view) as view1,SUM(s1.click) as click1,SUM(s2.view) as view2,SUM(s2.click) as click2 from Site s LEFT JOIN Log_site s1 ON (s.id=s1.site_id AND s1.date=CURDATE()) LEFT JOIN Log_site_all s2 ON (s.id=s2.site_id AND s2.date>=CURDATE()-INTERVAL 30 DAY) GROUP BY s.id


Результаты получаются неправильные sad Я подразумеваю, что одним запросом такую выборку сделать нельзя.

Подскажите, пожалуйста, в чем причина?

Отредактированно Mouse (10.09.2009 15:35:10)

Неактивен

 

#2 10.09.2009 15:48:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос из нескольких таблиц

Одним запросом эту выборку через JOIN сделать нельзя (т.к. JOIN подразумевает
произведение количества строк в таблице). Попробуйте через UNION:

SELECT * FROM Site JOIN Log_site WHERE ...
UNION
SELECT * FROM Site JOIN Log_site_all WHERE ...

Неактивен

 

#3 10.09.2009 15:50:37

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

Re: Запрос из нескольких таблиц

Пусть в таблице `Log_site` соответствуют x записей строке из таблицы `Site`, а в таблице `Log_site_all` - y. Тогда в результате первого объединения выполучите x строк, а в результате второго x*y строк. Потом происходит группировка и считается сумма.
А вам нужно посчитать сумму от x строк из `Log_site` и от y из `Log_site_all`.

Неактивен

 

#4 10.09.2009 16:12:53

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

Re: Запрос из нескольких таблиц

paulus написал:

Попробуйте через UNION:

Видимо туплю с просонья, но чем поможет UNION в данном случае не понял. Я подразумевал использовать подзапросы в части FROM. Двойное объединение по одной строке даст одну строку на выходе. Хотя запрос, наверное, будет тормозной.

Неактивен

 

#5 10.09.2009 16:43:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос из нескольких таблиц

Запрос сам по себе странный по смыслу; скорее всего, получение его результата
повергнет автора в ужас и заставит пересмотреть логику smile

Неактивен

 

#6 10.09.2009 17:30:49

Mouse
Участник
Зарегистрирован: 01.09.2009
Сообщений: 7

Re: Запрос из нескольких таблиц

Спасибо за советы. Пришлось разбить на 2 разных запроса.

Неактивен

 

Board footer

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