Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подскажите как улучшить запрос на выборку из 2-х таблиц
 
 автор: Доктор   (15.06.2009 в 13:29)   письмо автору
 
 

Добрый день.
Есть вот такие две таблицы:

CREATE TABLE IF NOT EXISTS `table_u` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `login` varchar(32) NOT NULL,
  `rid` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

и

CREATE TABLE IF NOT EXISTS `table_b` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL,
  `time_order` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

и вот такой запрос:

SELECT `table_ur`.`id` AS `id`, 
                `table_ur`.`login` AS `login`,
                COUNT(`table_b`.`id`) AS `num`
FROM (
              SELECT `table_u`.`id`,
                              `table_u`.`login`
              FROM `table_u`
              WHERE `table_u`.`rid` = 8
             ) AS `table_ur`  LEFT JOIN
                     `table_b`
ON `table_ur`.`id` = `table_b`.`uid`
GROUP BY `table_ur`.`id`

Как бы внятнее сформулировать вопрос...
Вообщем, необходимо выбрать тех пользователей из таблицы `table_u`, у которых поле `rid` равно (к примеру) 8 и которые отметелись в таблице `table_b` (подсчитывается сколько раз они в ней отметились).
При этом, если в таблице `table_b` нет никаких записей с выбранным `id`, то должно выдаваться 0.
я вот нагородил такой запрос (смотрите выше), но может есть и попроще решение?
P.S.: Заранее спасибо за помощь :)

  Ответить  
 
 автор: Trianon   (15.06.2009 в 14:28)   письмо автору
 
   для: Доктор   (15.06.2009 в 13:29)
 

SELECT u.id, u.login, COUNT(b.uid) AS num
  FROM table_u u 
    JOIN table_b ON u.id =b.uid 
  WHERE u.rid = 8 
  GROUP BY u.id, u.login
  HAVING num > 0

нет?

  Ответить  
 
 автор: Доктор   (15.06.2009 в 14:56)   письмо автору
 
   для: Trianon   (15.06.2009 в 14:28)
 

Немножко подправил и все отлично :)

SELECT u.id, u.login, 
                COUNT( b.uid ) AS num
FROM table_u u LEFT JOIN 
            table_b b 
ON u.id =b.uid
WHERE u.rid =8
GROUP BY u.id
HAVING num >=0

Trianon, спасибо вам большое :) ваш запрос выполняется чуть быстрее, так как не создается производной таблицы (как в моем примере). Спасибо :)

  Ответить  
 
 автор: Valick   (15.06.2009 в 14:56)   письмо автору
 
   для: Trianon   (15.06.2009 в 14:28)
 

Прошу простить мне мой педантизм)

 автор: Trianon   (06.06.2009 в 19:44)   письмо автору
      для: tAleks   (06.06.2009 в 19:40)
     HAVING вообще не должен появляться в запросах без GROUP BY

  Ответить  
 
 автор: Trianon   (15.06.2009 в 15:20)   письмо автору
 
   для: Valick   (15.06.2009 в 14:56)
 

ага.строка вывалилась. :)
Поправил.

Цитата исключительно верная. :))

  Ответить  
 
 автор: Valick   (15.06.2009 в 15:32)   письмо автору
 
   для: Trianon   (15.06.2009 в 15:20)
 

Про верность цитаты я и не сомневался (осталось только понять почему)
просто она достаточно крепко засела в моём мозге и как раз поэтому я и обратил внимание на данный запрос, за что и хочу Вам сказать в очередной раз спасибо.
Но если верить "Самоучитель MySQL5 М. Кузнецов И. Симдянов " стр.116, то "Допускается использование HAVING без группирровки GROUP BY."

  Ответить  
 
 автор: Trianon   (15.06.2009 в 15:33)   письмо автору
 
   для: Valick   (15.06.2009 в 15:32)
 

у каждого своя Библия.... :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования