Помогите составить MySQL запрос

sundance2001

Новичок
Помогите составить MySQL запрос

Добрый день.

Столкнулся с новой для меня задачей. Нужно состыковать таблицы. Главная таблица TRUCKS хранит информацию о грузовиках; TRUCK_TYPES хранит инфо о типах грузовиков (тягачи, грузовики, спецтехника, прицепы и т.д.); TRUCK_PICS хранит имена картинок для каждого вида грузовика.

Т.е. получается, что каждый грузовик может быть лишь ОДНОГО ТИПА, но может иметь НЕСКОЛЬКО фотографий.

Задача: вывести полный список грузовиков с полной информацией, названием типа и ОДНОЙ фотографией, причем если фотографии для грузовика нет, то все равно вывести информацию.

Структура таблиц:

TRUCKS
------------------------------------------------------------------------------
truck_id
type_id
loc_id
...


TRUCK_TYPES
------------------------------------------------------------------------------
type_id
name
...

TRUCK_PICS
------------------------------------------------------------------------------
pic_id
truck_id
name
...


ЗЫ: Сложность для меня заключается в том, чтобы грамотно присоединить таблицу картинок, причем таким образом, чтобы инфо о грузовиках выводилось даже если фотографии нет. Читая мануал, я понял, что делать это надо при помощи LEFT JOIN. Но как составить запрос я не знаю. Прошу вашей помощи, уважаемые форумчане и просто добрые люди!
 

Wicked

Новичок
Читая мануал, я понял, что делать это надо при помощи LEFT JOIN. Но как составить запрос я не знаю.
А там же, в мануале, это узнать нельзя?
http://dev.mysql.com/doc/refman/5.0/en/select.html - тут описан общий синтаксис SELECT'ов. Там можно заметить FROM table_references. Расшифровку синтаксиса table_references можно посмотреть вот тут: http://dev.mysql.com/doc/refman/5.0/en/join.html (в самом верху).
 

sundance2001

Новичок
Я не понимаю. Там еще замороченнее. Оказываются есть и другие JOIN'ы..

Подскажите запрос, пожалуйста. Я уже весь вечер мучась и стою на одном месте. Очень прошу о помощи.
 

Wicked

Новичок
Оказываются есть и другие JOIN'ы..
Вы правильно сказали, что вам нужен именно LEFT JOIN. В описании синтаксиса джоины там перечислены через "|", что значит "или". Так что пусть Вас это не смущает.

А нельзя посмотреть, как Вы пытались?
 

sundance2001

Новичок
Ну не мучайте меня, прошу вас.
Я действительно пробовал разные варианты. У меня не получается никак. Я близок к отчаянию.
Я не могу показать вам историю неправильных запросов, т.к. я много раз менял их, и сохранять их мне как-то не приходило в голову...
Я умею составлять простенькие запросы, а такие сложные мне составлять еще не приходилось. Дайте мне хотя бы намек также на то, как сделать, чтобы при выводе списка грузовики не повторялись столько раз, сколько картинок к ним привязано, а каждый грузовик выводился бы только один раз и с одной картинкой.
 

alexhemp

Новичок
sundance2001

Покажите ваши неправильные запросы. Вам укажут на ошибку. За вас писать их тут никто не будет.
 

Crazy

Developer
sundance2001, это бессмысленная постановка задачи.

SQL создан для решения осмысленных задач. В твоем случае это признак того, что ты сам не понимаешь, чего хочешь. И проблема у тебя не в том, чтобы выразить что-то на SQL, а в том, чтобы сформулировать осмысленную задачу.

Почему, если нужно выдавать одну картинку, ты хранишь более одной?
 

sundance2001

Новичок
Задача вполне осмыслена.

Выдавать нужно лишь одну картинку на странице.

При желании пользователь может перейти на специальную страницу, где будут представлены все картинки, относящиеся к данному грузовику.
 

Crazy

Developer
sundance2001, еще раз. Медленно. Каков критерий, по которому из N картинок выбирается именно эта конкретная?

"Первая встретившаяся" -- это не критерий.
 

Crazy

Developer
Прекрасно. Добавляешь условие:

where pic_id = ПерваяДобавленная,

где вместо ПерваяДобавленная пишешь подзапрос, возвращающий минимальный pic_id для указанного id грузовики.
 

sundance2001

Новичок
Уррааа! Получилось!

Спасибо всем помогавшим, а также не помогавшим врединам!
 

Wicked

Новичок
что-то мне подсказывает, что подзапросы sundance2001 таки не осилил :)

sundance2001
а можно теперь взглянуть на результат? :)
 
Сверху