Ошибка № 1241 SQL-запрос

Я все время получаю код ошибки # 1241. Я искал ответ, но не могу найти ответ, который помог бы мне.

Вот мой код:

SELECT name, address, city, phone  
FROM customer
WHERE customer.ID IN (
    SELECT customer.ID, COUNT(*) AS amount_reservations 
    FROM customer, (
        SELECT ID 
        FROM customer, reservations 
        WHERE rent_time = 'weekend' AND 
        ID = customer_ID
    ) AS foo 
    WHERE customer.ID = foo.ID 
    GROUP BY customer.ID 
    HAVING amount_reservations > 1
)
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
0
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В подзапросе SELECT customer.ID, COUNT(*) AS amount_reservations должен быть ОДИН столбец, а не два.

Измените его как:

SELECT name, address, city, phone  
  FROM customer  
  WHERE customer.ID IN (
    SELECT customer.ID
      FROM customer, (
        SELECT ID FROM customer, reservations 
          WHERE rent_time = 'weekend' AND ID = customer_ID
        ) AS foo 
      WHERE customer.ID = foo.ID 
      GROUP BY customer.ID HAVING count(*) > 1
    )

Вы не определяете amount_reservations - замените его на count(*), и это может сработать.

sgeddes 11.06.2018 19:54

Спасибо, исправил.

The Impaler 11.06.2018 19:55

Спасибо, теперь работает, но не могли бы вы объяснить, почему это необходимо?

Willy 11.06.2018 19:57

В SQL оператор В сравнивает кортежи. Кортеж может иметь одно или несколько значений. Следовательно, вы можете сравнить 1 значение с 1 значением или два значения с двумя значениями и т. Д .; однако вы не можете сравнивать одно значение с двумя значениями (ваша проблема). Вы пытались сравнить одно значение (customer.ID) с двумя значениями (customer.ID, count (*)). Это не принято в SQL.

The Impaler 11.06.2018 19:59

Вы имеете в виду, что я не могу сравнить ID с количеством бронирований? Думаю, в этом есть смысл. Спасибо! Да, кстати, ваш код работал без предложения sgeddes. Следует ли мне по-прежнему использовать это предложение или просто оставить все как есть?

Willy 11.06.2018 20:03

Да, можно (даже если в этом нет смысла). Вы не можете сравнивать [123] с [456, 789]. В этом нет смысла. Номер ОДИН против номеров ДВА? Это недопустимо в SQL.

The Impaler 11.06.2018 20:04

Очень рекомендую переписать ваш запрос. Удалите подзапросы - они не нужны. Тогда используйте explicit joins вместо запятых.

select c.id, c.name, c.address, c.city, c.phone  
from customer c
    join reservations r on c.id = r.customer_id
where r.rent_time = 'weekend'
group by c.id, c.name, c.address, c.city, c.phone  
having count(*) > 1

Это выглядит очень продвинутым. Думаю, в школе еще не достигла этого уровня. Спасибо за ответ!

Willy 11.06.2018 20:06

Если вы хотите использовать in, вы можете радикально упростить запрос:

SELECT c.name, c.address, c.city, c.phone  
FROM customer c
WHERE c.ID IN (SELECT r.customer_id
               FROM reservations r
               WHERE r.rent_time = 'weekend' 
               GROUP BY r.customer_id
               HAVING COUNT(*) > 1
              ) ;

Заметки:

  • Никогда используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный синтаксис JOIN.
  • Используйте псевдонимы таблиц и полные имена столбцов для всех ссылок на столбцы.
  • Вам не нужен JOIN в подзапросе, потому что у вас есть идентификатор клиента в таблице бронирования.

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