j'ai besoin de trouver dans la base de données sakila la plus longue période de location d'un film. j'ai trié ceci:
SELECT DISTINCT
customer.first_name
FROM
rental,
customer
WHERE
rental.customer_id = customer.customer_id
GROUP BY
rental.rental_id
HAVING
(
rental.return_date - rental.rental_date
) =(
SELECT
MAX(countRental)
FROM
(
SELECT
(
rental.return_date - rental.rental_date
) AS countRental
FROM
rental,
customer
GROUP BY
rental.rental_id
) AS t1
)
mais je reçois l'erreur:
est-ce que quelqu'un sait pourquoi? j'ai utilisé une colonne qui est censée être les données agrégées .. qu'est-ce qui me manque
Comme écrit dans la documentation
La norme SQL requiert que HAVING ne fasse référence qu'aux colonnes de la clause GROUP BY ou aux colonnes utilisées dans les fonctions d'agrégation. Cependant, MySQL prend en charge une extension de ce comportement et permet à HAVING de faire également référence aux colonnes de la liste SELECT et aux colonnes des sous-requêtes externes.
Vous devez spécifier return_date et rental_date dans la clause select.
Il y a deux options:
SELECT DISTINCT
customer.first_name,
rental.return_date,
rental.rental_date
FROM
rental,
customer
WHERE
rental.customer_id = customer.customer_id
GROUP BY
rental.rental_id
HAVING
(
rental.return_date - rental.rental_date
) =(
...
ou
SELECT DISTINCT
customer.first_name,
(rental.return_date - rental.rental_date) as rental_duration
FROM
rental,
customer
WHERE
rental.customer_id = customer.customer_id
GROUP BY
rental.rental_id
HAVING
rental_duration =(
...
Les deux devraient fonctionner très bien.