Объединить 2 запроса в один

Я хотел бы объединить 2 запроса в один. Я хотел бы нарисовать букву от last_name и найти страны, которые начинаются с этой буквы. Мой запрос дает мне более одной буквы, и я не знаю, почему.

    SELECT CONCAT(LOWER(SUBSTR(country, 1, LENGTH(country) - 1)), 
           UPPER(substr(country, -1))) AS Kraj,
           COUNT(C.country_id) AS ilosc
FROM city AS C
JOIN country AS CO ON C.country_id = CO.country_id
WHERE country LIKE
    (SELECT CONCAT(LEFT(last_name, 1), '%')
     FROM actor
     ORDER BY RAND()
     LIMIT 1)
GROUP BY C.country_id
HAVING COUNT(C.country_id) > 1;

во-первых, измените его на INNER_JOIN, это будет для вас более читаемо: ПРИСОЕДИНЯЙТЕСЬ к стране КАК CO ON C.country_id = CO.country_id во-вторых: вы извлекаете данные из таблиц, мы не видим данных. если вы хотите получить только один результат для примера, который вы берете, рассмотрите возможность использования DISTINCT

Ido Bleicher 21.01.2019 13:35

База данных получена из: mysql-tools.com/downloads/mysql-databases/4-sakila-db.html

Bro 21.01.2019 13:55
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
83
2

Ответы 2

во-первых, измените его на INNER_JOIN, это будет для вас более читаемо: ПРИСОЕДИНЯЙТЕСЬ к стране КАК CO ON C.country_id = CO.country_id во-вторых: вы извлекаете данные из таблиц, мы не видим данных. если вы хотите получить только один результат для примера, который вы берете, рассмотрите возможность использования DISTINCT

SELECT DISTINCT CONCAT(LOWER(SUBSTR(country, 1, LENGTH(country) - 1)), 
       UPPER(substr(country, -1))) AS Kraj,
       COUNT(C.country_id) AS ilosc
FROM city AS C
INNER JOIN country AS CO ON C.country_id = CO.country_id
WHERE country LIKE
    (SELECT CONCAT(LEFT(last_name, 1), '%')
     FROM actor
     ORDER BY RAND()
     LIMIT 1)
GROUP BY C.country_id
HAVING COUNT(C.country_id) > 1;

не имеет значения, использую ли я соединение или внутреннее соединение, это одно и то же

Bro 21.01.2019 14:50

да, но это делает его более легким для чтения и понимания. ты прав. Я упоминаю, что это то же самое :)

Ido Bleicher 22.01.2019 10:40

Для каждой страны СУБД оценивает критерии в предложении WHERE, таким образом выполняя подзапрос снова и снова и получая разные буквы вместо одной.

Вместо этого используйте CROSS JOIN, чтобы указать одну случайную букву.

SELECT
  CONCAT(LOWER(SUBSTR(country, 1, LENGTH(country) - 1)), UPPER(substr(country, -1))) AS Kraj,
  COUNT(C.country_id) AS ilosc
FROM city AS C
JOIN country AS CO ON C.country_id = CO.country_id
CROSS JOIN 
(
  SELECT CONCAT(LEFT(last_name, 1), '%') AS letter
  FROM actor
  ORDER BY RAND()
  LIMIT 1
) the_one
WHERE country LIKE the_one.letter
GROUP BY C.country_id
HAVING COUNT(C.country_id) > 1;

Другие вопросы по теме