@lexstile

Как правильно составить SQL-запрос?

Есть функция, которая работает корректно:
public function getListEvents($route) {
		$max = 10;
		$params = [
			'max' => $max,
			'start' => ((($route['num'] ?? 1) - 1) * $max),
		];
		return $this->db->row('
			SELECT events.id, events.name as event_name, events.country_id, events.description, countries.name as country_name, GROUP_CONCAT(links.link) as links FROM events
			JOIN countries ON events.country_id = countries.id
			LEFT JOIN links ON events.id = links.event_id
			GROUP BY events.id
			ORDER BY id DESC
			LIMIT :start, :max
		', $params);
	}

Необходимо добавить получение картинок по аналогии со ссылками, пробую так:
return $this->db->row('
			SELECT events.id, events.name as event_name, events.country_id, events.description, countries.name as country_name, GROUP_CONCAT(links.link) as links, GROUP_CONCAT(images.name) as images FROM events
			JOIN countries ON events.country_id = countries.id
			LEFT JOIN links ON events.id = links.event_id
			LEFT JOIN images ON events.id = images.event_id
			GROUP BY events.id
			ORDER BY id DESC
			LIMIT :start, :max
		', $params);

Но ссылки и картинки дублируется, подскажите, как правильно составить запрос?
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
JOIN'ить с готовыми группировками.
SELECT `e`.`id`, `e`.`name` as `event_name`, `e`.`country_id`, `e`.`description`,
       `c`.`name` as `country_name`, `l`.`links`, `i`.`images`
  FROM `events` AS `e`
  JOIN `countries` AS `c`
    ON `c`.`id` = `e`.`country_id`
  LEFT JOIN (
    SELECT `event_id`, GROUP_CONCAT(`link`) AS `links`
      FROM `links`
      GROUP BY `event_id`
  ) AS `l`
    ON `l`.`event_id` = `e`.`id`
  LEFT JOIN (
    SELECT `event_id`, GROUP_CONCAT(`name`) AS `images`
      FROM `images`
      GROUP BY `event_id`
  ) AS `i`
    ON `i`.`event_id` = `e`.`id`
  ORDER BY `e`.`id` DESC
  LIMIT :start, :max

Оно и логически правильнее, ваша конструкция под строгий вариант SQL не пройдёт, в ней есть группировка, но некоторые поля выборки и не присутствуют в выражении GROUP BY, и по ним нет агрегатной функции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы