web-dev-qa-db-fra.com

Colonne inconnue dans 'clause d'avoir'

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:

1054 - Colonne inconnue 'rental.return_date' dans 'clause clause'

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

15
mike

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.

30
piotrgajow