1

データベース クラスのクエリで問題が発生しています。次のスキーマがあるとします。

  • 顧客 ( customerid, first_name, last_name, address, city, state, phone, status)
  • 支店 ( branchno, address, city, state, phone, manager_name)
  • 従業員 ( empno, firstname, lastname, address, city, state, phone, emergency_contact, title, managerno)
  • 客室 ( roomno, branchno, price, bed_size)
  • 予約 ( roomno, branchno, customerid, checkin_date, checkout_date, empno)

最も高い部屋を借りた顧客を見つけたいです。このクエリを試してみました...

SELECT customerid FROM bookings NATURAL JOIN rooms 
EXCEPT
(SELECT customerid FROM (bookings NATURAL JOIN rooms) AS S, (bookings NATURAL JOIN
    rooms) as T WHERE S.price < T.price)

問題は、テーブルの名前を変更したい方法から来ています。デカルト積のコンポーネントとして、予約と部屋の自然結合を使用したいのですが...どうすればよいですか?

どうもありがとうございました。

4

2 に答える 2

2

これを使用できます:

SELECT 
    customerid 
FROM 
    Bookings 
  NATURAL JOIN 
    Rooms
  NATURAL JOIN
    ( SELECT MAX(price) AS price
      FROM Rooms
    ) AS MostExpensiveRoom

customerid2番目のサブクエリでS.どちらが必要かを明確にする必要があることを除いて、クエリは有効に見えますT.。コンマ,構文はCROSS JOIN中間Sを意味するTため、2 つの顧客 ID があります。

(SELECT customerid FROM bookings NATURAL JOIN rooms)
EXCEPT
(SELECT S.customerid 
 FROM 
     (bookings NATURAL JOIN rooms) AS S
   CROSS JOIN
     (bookings NATURAL JOIN rooms) AS T 
 WHERE S.price < T.price
)
于 2011-12-12T00:40:40.497 に答える
-1
SELECT * FROM customers as c
INNER JOIN bookings as b ON b.customerid = c.customerid
INNER JOIN rooms as r ON r.roomno = b.roomno
ORDER BY r.price DESC
LIMIT 1;

名前または指定されたフィールドのみが必要な場合は、GROUP BY を使用できます。

このクエリは同じことを行います (前のクエリが構文的に適切な場合)。

SELECT * FROM customers,bookings,rooms
WHERE bookings.customerid = customers.customerid
AND rooms.roomno = bookings.roomno
ORDER BY rooms.price DESC
LIMIT 1

したがって、id-s と名前を家賃順で並べたい場合は、次のようにします。

SELECT customers.customerid, customers.fistname, customers.lastname FROM
customers,bookings,rooms
WHERE bookings.customerid = customers.customerid
AND rooms.roomno = bookings.roomno
ORDER BY rooms.price DESC
GROUP BY customers.customerid, customers.fistname, customers.lastname 
LIMIT 10
于 2011-12-12T00:49:25.837 に答える