parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

G_Z 05.07.2014 14:45

на самом деле мой первый вариант это фактически вариант G_Z, где часть условия вынесена из ON в WHERE. я обычно в ON оставляю только условие объединения таблиц, а фильтрацию выношу в WHERE, т.к. это мне кажется лучше с точки зрения логики
Меня приучили к обратному: всё, что относится к таблице писать в ON.
Разницы быть не должно, но WHERE не разрастается.

Касательно
SELECT
	c.car_id,
	c.date,
	c.car_name,
	c.car_modification,
	c.price,
	c.mileage,
	c.color,
	ci.img_name
FROM
  cars AS c
  JOIN (
	SELECT
        i.car_id,
        i.img_name,
        MIN(i.img_id)
	FROM
        images AS i
    GROUP BY
        i.car_id
  ) AS ci ON (c.car_id = ci.car_id)
;
есть пара оговорок:
	SELECT
        i.car_id,
        i.img_name,
        MIN(i.img_id)
	FROM
        images AS i
    GROUP BY
        i.car_id
MySQL не всегда вернёт при такой группировке корректный img_name, если (не в данной задаче) img_id может повторяться — будут ошибки.
Я всегда стараюсь достать только вычисленное поле и потом сделать дополнительное объединение, чтобы достать верные записи.

Если порядок сгруппированных записей не важен, то лучше указывать у GROUP BY ещё ORDER BY NULL, это отключит встроенную сортировку MySQL по группируемым полям и избавит от filesort.