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

Форум MySQL

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

 

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

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

тема: Помогите дополнить многотабличный запрос.
 
 автор: Indemion   (07.03.2007 в 12:53)   письмо автору
 
 

Существует две таблицы
1. b_books
В ней:
а). bb_id (порядковый номер книги)
б). bb_name (название книги)

2. bb_price
В ней:
а). bb_id (порядковый номер книги)
б). bb_price(цена книги)
в) data (дата ввода цены)

Итак есть две книги.
№1 Панов
№2 Орлов

И цены:
№1 400р. 22.05.2006
№1 420р. 22.09.2006
№2 200р. 15.06.2006
№2 300р. 19.12.2006

Мне нужно вывести на экран: номер каждый книги, название и цену по наиболее свежей дате вводе.
То есть должно получиться
№1 Панов 420р
№2 Орлов 300р.

мой запрос со всем справляется, кроме правильной цены.

SELECT bb_price.bb_id, b_books.name, bb_price.bb_price, MAX(bb_price.data) AS `Max-data`
FROM b_books INNER JOIN bb_price ON b_books.bb_id = bb_price.bb_id
GROUP BY bb_price.bb_id, b_books.name
ORDER BY Max( bb_price.data )


Если использовать FIRST то все работает отлично, то это под windows. а под unix не понимает, как можно изменить этот запрос или дополнить мой (тот что выше) чтобы получить нужный мне результат?

SELECT bb_price.bb_id, b_books.name, FIRST(bb_price.bb_price) AS `First-bb_price`, MAX(bb_price.data) AS `Max-data`
FROM b_books INNER JOIN bb_price ON b_books.bb_id = bb_price.bb_id
GROUP BY bb_price.bb_id, b_books.name
ORDER BY Max( bb_price.data )


Спасибо.

   
 
 автор: cheops   (07.03.2007 в 13:18)   письмо автору
 
   для: Indemion   (07.03.2007 в 12:53)
 

Под UNIX какая версия MySQL используется?

   
 
 автор: Indemion   (07.03.2007 в 14:55)   письмо автору
 
   для: cheops   (07.03.2007 в 13:18)
 

Точно, у хостера не нашел где указанно, но я вызвал phpinfo и получается, что 4.1.12.
На всякий случай оставил там файл, где вызывал phpinfo - вдруг еще какая-либо информация понадобится.
http://www.neopets.com.ru/ppp.php

   
 
 автор: Trianon   (07.03.2007 в 15:57)   письмо автору
 
   для: Indemion   (07.03.2007 в 12:53)
 

JOIN идет не над теми таблицами.

Сперва нужно получить актуальные даты, сгруппированные по ключам книг.
Потом по датам - первичные ключи цен
Потом по ключам цен - сами цены соединить с книгами.

Первичных ключей цен у Вас не видно.

   
 
 автор: Indemion   (08.03.2007 в 17:05)   письмо автору
 
   для: Trianon   (07.03.2007 в 15:57)
 

То есть надо делать 2 запроса?

   
 
 автор: Trianon   (08.03.2007 в 17:13)   письмо автору
 
   для: Indemion   (08.03.2007 в 17:05)
 

Я бы ввел первичный ключ в таблицу цен. Пусть даже суррогатный. Дальше запрос скорее всего можно было бы составить один. Как минимум если сервер 4.1 и выше.

   
 
 автор: Indemion   (09.03.2007 в 11:56)   письмо автору
 
   для: Trianon   (08.03.2007 в 17:13)
 

Сидел до 3-х утра. Не получается ничего. Видимо моих знаних реально не хватает. А можно помочь практическим решением? Какой первичный ключ? Или еще какой практический совет по решению этой задачи. Спасибо.

   
 
 автор: Indemion   (09.03.2007 в 12:21)   письмо автору
 
   для: Indemion   (09.03.2007 в 11:56)
 

Пока работает вот это, но считаю, что можно задачу упростить.

SELECT * 
FROM b_books INNER JOIN bb_price ON bb_price.bb_id = b_books.bb_id
WHERE data = (SELECT MAX(data) FROM `bb_price` WHERE bb_price.bb_id = b_books.bb_id)

   
 
 автор: Trianon   (09.03.2007 в 12:38)   письмо автору
 
   для: Indemion   (09.03.2007 в 11:56)
 


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

CREATE TABLE `b_books` (
  `bb_id` int(11) NOT NULL auto_increment,
  `bb_name` varchar(255) NOT NULL,
  PRIMARY KEY  (`bb_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

-- 
-- Дамп данных таблицы `b_books`
-- 

INSERT INTO `b_books` (`bb_id`, `bb_name`) VALUES 
(1, 'Панов'),
(2, 'Орлов');

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

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

CREATE TABLE `b_price` (
  `pr_id` int(11) NOT NULL auto_increment,
  `pr_book_id` int(11) NOT NULL,
  `pr_price` decimal(6,2) NOT NULL,
  `pr_date` datetime NOT NULL,
  PRIMARY KEY  (`pr_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;

-- 
-- Дамп данных таблицы `b_price`
-- 

INSERT INTO `b_price` (`pr_id`, `pr_book_id`, `pr_price`, `pr_date`) VALUES 
(1, 1, '400.00', '2006-05-22 00:00:00'),
(2, 1, '420.00', '2006-09-05 00:00:00'),
(3, 2, '200.00', '2006-06-15 00:00:00'),
(4, 2, '300.00', '2006-12-19 00:00:00');



SELECT bb_id, bb_name, pr_id, pr_price, pr_date 
FROM
  (SELECT pr_book_id AS aid, MAX(pr_date) AS mdt 
      FROM b_price GROUP BY pr_book_id
  ) AS a_price 
  JOIN b_price 
  ON date = mdt
  RIGHT JOIN b_books ON bb_id=pr_book_id 


bb_id bb_name pr_id pr_price pr_date
-----+-------+-----+--------+-------------------  
    1 Панов       2   420.00 2006-09-05 00:00:00 
    2 Орлов       4   300.00 2006-12-19 00:00:00 

   
 
 автор: Indemion   (09.03.2007 в 15:02)   письмо автору
 
   для: Trianon   (09.03.2007 в 12:38)
 

Спасибо. Буду комбинировать со своим вариантом для упрощения запроса.

   
Rambler's Top100
вверх

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