Я хотел бы объединить 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;
База данных получена из: mysql-tools.com/downloads/mysql-databases/4-sakila-db.html






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