glossyweb
@glossyweb
Mark marketing

Возможно ли оптимизировать mysql запрос?

SELECT 
      name,iso2,(SELECT COUNT(`link_id`) FROM `links` WHERE `country` = `countries`.`iso2`) AS `total_links` 
FROM 
           `countries` 
WHERE (SELECT COUNT(`link_id`) FROM `links` WHERE `country` = `countries`.`iso2`) > 0 ORDER BY `name`

Вывод мне нужен вот такой:

[{"name":"United States","iso2":"US","total_links":"1"},{"name":"Venezuela","iso2":"VE","total_links":"1"},{"name":"Vietnam","iso2":"VN","total_links":"2"}]

Время выполнения - 1.422147 s.
Можно ли как-то оптимизировать?
  • Вопрос задан
  • 169 просмотров
Решения вопроса 2
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
Сразу готовый JSON из базы данных:
WITH countries_links AS (
    SELECT JSON_OBJECT('name', `name`, 'iso2', `iso2`, 'links', COUNT(`link_id`)) d
    FROM `links`
    JOIN `countries` ON `countries`.`iso2` = `links`.`country`
    GROUP BY `name`, `iso2`
    HAVING COUNT(`link_id`) > 0
) SELECT JSON_ARRAYAGG(d) FROM countries_links

Пример: https://sqlize.online/sql/mysql80/087bf8ba4f587b13...
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `c`.`name`, `c`.`iso2`, `t`.`total_links`
  FROM (
    SELECT `country`, COUNT(*) AS `total_links`
      FROM `links`
      GROUP BY `country`
  ) AS `t`
  JOIN `countries` AS `c` ON `c`.`iso2` = `t`.`country`
  ORDER BY `c`.`name`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
glossyweb
@glossyweb Автор вопроса
Mark marketing
Дополню еще этот вопрос, чтобы не плодить темы.
Благодоря ответам выше Rsa97 я вывел 3 блока таким образом:

64cbba168207a406015559.png

$country_query = database()->query("
			SELECT `c`.`name`, `c`.`iso2`, `c`.`subregion`, `t`.`total_links`
  FROM (
    SELECT `country`, COUNT(*) AS `total_links`
      FROM `links`
      GROUP BY `country`
  ) AS `t`
  JOIN `countries` AS `c` ON `c`.`iso2` = `t`.`country`
  ORDER BY `t`.`total_links` DESC
		");

		$state_query = database()->query("
			SELECT `s`.`name`, `s`.`id`, `s`.`country_code`, `t`.`total_links`
  FROM (
    SELECT `state`, COUNT(*) AS `total_links`
      FROM `links`
      GROUP BY `state`
  ) AS `t`
  JOIN `states` AS `s` ON `s`.`id` = `t`.`state`
  ORDER BY `t`.`total_links` DESC
		");

		$city_query = database()->query("
			SELECT `c`.`name`, `c`.`id`, `c`.`country_code`, `t`.`total_links`
  FROM (
    SELECT `city_name`, COUNT(*) AS `total_links`
      FROM `links`
      GROUP BY `city_name`
  ) AS `t`
  JOIN `cities` AS `c` ON `c`.`id` = `t`.`city_name`
  ORDER BY `t`.`total_links` DESC
		");


Как мне вывести в 3м блоке под именем Города его регион, но регион в таблице cities записан таким образом:

64cbbbe5d88b3919375668.png

возможно ли вывести индекс как имя а не цифру?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы