Я все время получаю код ошибки # 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
)






В подзапросе 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
)
Спасибо, исправил.
Спасибо, теперь работает, но не могли бы вы объяснить, почему это необходимо?
В SQL оператор В сравнивает кортежи. Кортеж может иметь одно или несколько значений. Следовательно, вы можете сравнить 1 значение с 1 значением или два значения с двумя значениями и т. Д .; однако вы не можете сравнивать одно значение с двумя значениями (ваша проблема). Вы пытались сравнить одно значение (customer.ID) с двумя значениями (customer.ID, count (*)). Это не принято в SQL.
Вы имеете в виду, что я не могу сравнить ID с количеством бронирований? Думаю, в этом есть смысл. Спасибо! Да, кстати, ваш код работал без предложения sgeddes. Следует ли мне по-прежнему использовать это предложение или просто оставить все как есть?
Да, можно (даже если в этом нет смысла). Вы не можете сравнивать [123] с [456, 789]. В этом нет смысла. Номер ОДИН против номеров ДВА? Это недопустимо в SQL.
Очень рекомендую переписать ваш запрос. Удалите подзапросы - они не нужны. Тогда используйте 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
Это выглядит очень продвинутым. Думаю, в школе еще не достигла этого уровня. Спасибо за ответ!
Если вы хотите использовать 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 в подзапросе, потому что у вас есть идентификатор клиента в таблице бронирования.
Вы не определяете
amount_reservations- замените его наcount(*), и это может сработать.