0

sso タイトルで必要なことを正確に表現できませんでした。私は mysql を初めて使用します。まず第一に、これは私が現在使用している sql テーブルですhttp://dl.dropbox.com/u/37057843/P2_Scripts.sql

簡単に説明します。ホテルに複数回、すべてのタイプの部屋に少なくとも 1 回滞在したクライアントを取得する必要があります。(下の表の説明を確認してください)

これらはテーブルです:

  • 予約の ID (id)、予約したクライアントの ID (idCliente)、および部屋番号 (idHabita) を含む reservas (reservations)。
  • clientes、ID、名前 (nombre)、姓 (apellido)、住所、電話番号 (最後の 2 つは使用されません) を含む client テーブル
  • 部屋番号 (id)、m2 単位のサイズ (表面)、重要ではないいくつかの項目、および最後に価格の ID (idPrecio) を含む、habitaciones (部屋)。
  • エントリの ID、部屋のタイプ (tipo)、価格 (precio) を含む precios (価格)。TIPO の値は、'individual' または 'double' です。個室や二人部屋など。

だから基本的に、

  • reservas.idCliente = clientes.id
  • reservas.idHabita=habitaciones.id
  • Habitaciones.precio = precio.id

先に述べたように、すべてのタイプの部屋に少なくとも 1 度はいるクライアントを獲得する必要があるため、基本的には個室に 1 度以上、ダブルルームに 1 度以上いるクライアントを獲得する必要があります。

説明が下手なのはわかっていますが、どう説明すればよいかわかりません。申し訳ありません。

現時点では、このクエリを使用して、個々の部屋にいた人 (名前、姓、部屋番号) を取得しています。

SELECT c.nombre, c.apellidos, r.idHabita
FROM  clientes c, reservas r, precios p, habitaciones h
WHERE r.idCliente = c.id
AND r.idHabita = h.id
AND h.idPrecio = p.id
AND p.tipo LIKE 'individual'

p.tipo も「double」かどうかを確認するために何らかのサブクエリを実行する必要があることはわかっていますが、うまくいきません。このクエリが返すクライアントは、2 人部屋にいたクライアントと同じです。実際、これまでに個室にあったのはこれらだけです。しかし、それらがダブルルームにもあったことを確認するクエリが必要です。

読んでくれてありがとう!

4

2 に答える 2

2

「すべてのタイプの部屋に少なくとも 1 度はいた」クライアントを取得するには、関連する予約を含むクライアント テーブルを結合し、結果をクライアント別にグループ化します。HAVING句で表現できる部屋タイプの表:

SELECT   c.*
FROM     clientes     c
  JOIN   reservas     r ON r.idCliente = c.id
  JOIN   habitaciones h ON r.idHabita  = h.id
  JOIN   precios      p ON h.idPrecio  = p.id
GROUP BY c.id
HAVING   COUNT(DISTINCT p.tipo) = (
  SELECT COUNT(DISTINCT   tipo) FROM precios
)

sqlfiddleで参照してください。

于 2012-06-05T18:16:08.023 に答える
0

これは、資格のあるすべての部屋の行を示しています (1 人あたり複数の部屋 - 少なくとも 1 人の個人と少なくとも 1 つのダブル) - まさにあなたが要求した出力です (ちなみに、彼らがあなたを助けてくれたら答えを受け入れるか、人々はあなたを助けなくなるでしょう):

SELECT c.nombre, c.apellidos, r.idHabita
FROM clientes c
INNER JOIN reservas r
ON r.idCliente = c.id
INNER JOIN habitaciones h
ON r.idHabita = h.id
WHERE r.idCliente IN
(SELECT r1.idCliente
FROM clientes c1
INNER JOIN reservas r1
ON r1.idCliente = c1.id
INNER JOIN habitaciones h1
ON r1.idHabita = h1.id
INNER JOIN precios p1
ON h1.idPrecio = p1.id
WHERE p1.tipo = 'individual')
AND r.idCliente IN
(SELECT r2.idCliente
FROM clientes c2
INNER JOIN reservas r2
ON r2.idCliente = c2.id
INNER JOIN habitaciones h2
ON r2.idHabita = h2.id
INNER JOIN precios p2
ON h2.idPrecio = p2.id
WHERE p2.tipo = 'doble')
ORDER BY c.nombre, c.apellidos, r.idHabita

更新:並べ替えを追加しました...

于 2012-06-05T18:13:39.960 に答える