Подскажите плз запрос: выборка из двух таблиц

SCM

Guest
Подскажите плз запрос: выборка из двух таблиц

Народ, помогите плз, никак не могу победить.

Есть две таблицы - Продукты и ИсторияПродуктов.
Продукт - простая таблица (ID, ProductName)
ИсторияПродуктов - это история добавления продуктов (ProductID, ДатаДобавления, КомментарийДобавления).

Вот мне надо показать список всех продуктов построчно: ИмяПродукта, ПерваяДатаДобавления, ПоследняяДатаДобавления, ПоследнийКоментарийДобавления.


Ведь можно это сделать в одном запросе, а не в цикле пучком запросов по каждому продукту, но никак не получается.
HELP плиз.
 

Фанат

oncle terrible
Команда форума
сложновато будет.
если без комментария - то можно
 

SCM

Guest
Ага, дату можно получить с помощью MIN и MAX.
Это я уже понял.

А как же с комментарием?
Если уже не одним запросом, то как минимальным их количеством?
 

Фанат

oncle terrible
Команда форума
ну, теоретически, можно и одним.
просто там ещё раз таблицу добавлений джойнить к самой себе.
 

Фанат

oncle terrible
Команда форума
ну, так же, как любую другую.
даёшь ей алиас и работаешь как со второй таблицей.
джойнишь по этому максу и айди продукта.

не уверен, правда, что получится, но попробовать можно
 

alpine

Новичок
Фанат
Без подзапросов только через временную таблицу IMHO.

-~{}~ 28.08.05 01:12:

Примерно так
[sql]
LOCK TABLE ProductsHistory,ph READ;

CREATE TEMPORARY TABLE tmp
SELECT
p.*,
MAX(ph.date) AS max_date,
MIN(ph.date) AS min_date
FROM
Products AS p
LEFT JOIN `ProductsHistory` AS ph ON p.id = ph.product_id
GROUP BY p.id;



SELECT
t.*,
ph.comment FROM tmp AS t,
ProductsHistory AS ph
WHERE
t.id=ph.product_id
AND
t.max_date = ph.date;

UNLOCK TABLES;
DROP TABLE tmp;
[/sql]
 

Фанат

oncle terrible
Команда форума
мне кажется, что можно сделать, как я написал.
ведь запись однозначно идентифицируется максимальной датой и продуктом
 

alpine

Новичок
дело в том что в коментарии который относится к максимальной дате весь замес ...
 

Фанат

oncle terrible
Команда форума
чювак.
ты, вообще, читаешь, что я пишу?
а я, по-твоему, про что? про космонавта Жугдэрдэмидийна Гуррагчу?
 

jer

...
можно и одним, только сомневаюсь насчет скорости работы:

[SQL]
SELECT a.name,
MIN(b.comm_date) AS comm_date_first,
MAX(b.comm_date) AS comm_date_last,
SUBSTRING(MAX(CONCAT(b.comm_date, a.comment)),20) AS comm_desc_last
FROM prod a
LEFT JOIN comm b ON a.id=b.prod_id
GROUP BY a.id
[/SQL]
 

alpine

Новичок
Фанат
Чувак, я сомневаюсь что кто-то это нормально реализует в одном запросе с джоинами, вот и все ...
 

jer

...
а ты попробуй, возможно на твоей задаче и не будет тормозить
 

SCM

Guest
Фанат - я всё равно не пойму как. Можешь сделать код?

jer - твой вариант выбирает только первую запись по каждому продукту. А мне комментарий нужно получить для последней записи.

alpine - версия 4.0x, но при необходимости можно и сменить вверх.
Сейчас буду разбираться с временной таблицей, для меня это немного сложно.

-~{}~ 29.08.05 21:21:

alpine - несколько строк в запросе - это ведь только с версии 4.1.
 

SCM

Guest
Я пытаюсь сделать то, что посоветовал alpine - в его примере пять строк-запросов.
Как их выполнить на моём mySQL 4.0.x - не знаю :(
Через запятую не работает.
 

Фанат

oncle terrible
Команда форума
что за чушь?
прекрасно всё выполняется, обычным порядком.
ты что - никогда больше одного запроса не исполнял что ли?
 

SCM

Guest
никогда :)

Такое:
PHP:
mysql_query("SELECT * FROM Product")
работает.

Такое:
PHP:
mysql_query("DROP TABLE IF EXISTS test_table;SELECT * FROM Product")
не работает - выдаёт 0 результатов.
Таблицы test_table у меня нет.
 
Сверху