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

Форум MySQL

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

 

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

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

тема: запрос к двум таблицам
 
 автор: Anatoly_ua   (22.05.2008 в 13:41)   письмо автору
 
 

есть две таблицы:

Первая NEWS с полями:
id
date
content

Вторая PICS с полями:
news_id
poz
pic_name

Т.е. каждой новости соответствует несколько (или ни одной) картинок. Причем картинки идут в заданном порядке (за что отвечает поле poz в PICS, но значения в этом поле произвольные, т.е. может быть 0, 1, 2..., а может 10, 20, 30 и т.п.)

Можно ли одним запросом получить массив вида
NEWS.date, NEWS.content, PICS.pic_name
где PICS.pic_name соответствует картинке из всех возможных для определенного news_id с мин. значением в поле poz (или пустое значение, если такой картинки нет)?

   
 
 автор: Root   (22.05.2008 в 14:44)   письмо автору
 
   для: Anatoly_ua   (22.05.2008 в 13:41)
 

как-то так :-/

SELECT news.*, pics.pic_name FROM news
LEFT JOIN
  (SELECT pics.news_id as pid, min(poz) as minpos
    FROM pics GROUP BY pics.news_id
  ) AS p ON news.id = p.pid
LEFT JOIN pics ON pics.poz = p.minpos;

   
 
 автор: Anatoly_ua   (22.05.2008 в 15:38)   письмо автору
 
   для: Root   (22.05.2008 в 14:44)
 

ого... Спасибо. Попробую

   
 
 автор: Root   (22.05.2008 в 17:06)   письмо автору
 
   для: Anatoly_ua   (22.05.2008 в 15:38)
 


SELECT news.*, pics.pic_name FROM news
LEFT JOIN pics ON pics.poz = (
 SELECT min(poz)
 FROM pics WHERE news.id = pics.news_id
);

   
 
 автор: Anatoly_ua   (22.05.2008 в 17:29)   письмо автору
 
   для: Root   (22.05.2008 в 17:06)
 

Спасибо! :) Это, пожалуй, ближе к истине...

   
 
 автор: Anatoly_ua   (02.06.2008 в 16:06)   письмо автору
 
   для: Root   (22.05.2008 в 17:06)
 

Только нужно чуть добавить:


SELECT news.*, pics.pic_name FROM news
LEFT JOIN pics ON news.id = pics.news_id AND pics.poz = (
 SELECT min(poz)
 FROM pics WHERE news.id = pics.news_id
); 

   
 
 автор: root   (02.06.2008 в 16:24)   письмо автору
 
   для: Anatoly_ua   (02.06.2008 в 16:06)
 

:)

   
 
 автор: Anatoly_ua   (03.06.2008 в 15:24)   письмо автору
 
   для: Anatoly_ua   (02.06.2008 в 16:06)
 

И еще один апдейт :))
Оказалось, что если poz одинаковые, то нужно еще Group добавить:

SELECT news.*, pics.pic_name FROM news
LEFT JOIN pics ON news.id = pics.news_id AND pics.poz = (
 SELECT min(poz)
 FROM pics WHERE news.id = pics.news_id
)
GROUP BY news.id;


Вроде бы так работает как надо...

   
Rambler's Top100
вверх

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