1. ホーム
  2. mysql

[解決済み] having節に未知のカラムがある

2022-02-28 03:17:41

質問

映画の最長レンタル期間をsakilaデータベースで見つけたいのですが。 私はこれを試した。

  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
    )

が、エラーになります。

# 1054 - Unknown column 'rental.return_date' in 'having clause'

なぜかわかる方いらっしゃいますか?私は集計されたデータであるはずのカラムを使用しています。何が足りないのでしょうか?

解決方法を教えてください。

ドキュメントに書かれているように

<ブロッククオート

標準SQLでは、HAVINGはGROUP BY句の列、または集約関数で使用される列のみを参照しなければならないとされています。しかし、MySQL はこの動作の拡張をサポートし、SELECT リスト内のカラムと外部サブクエリ内のカラムを HAVING が参照することを許可しています。

select節でreturn_dateとrental_dateを指定する必要があります。

2つのオプションがあります。

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
  ) =(
  ...

または

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 =(
  ...

どちらも問題なく動作するはずです。